← SEARCHABLE ARCHIVE
Rust · 2026-08-08

Rust von den Grundlagen bis zum Profi — Folge 8

Wählen Sie Ihre Eigentumsstruktur mit Box, Rc, Arc

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Die meisten Werte können nur lokalen Variablen und Sammlungen gehören. Wenn Sie sich an den Heap halten oder ihn an mehrere Besitzer weitergeben möchten, wählen Sie einen Smart Pointer, der Ihren Zweck erfüllt.

Box

enum Node {
    Value(i32, Box<Node>),
    End,
}

let list = Node::Value(
    10,
    Box::new(Node::Value(20, Box::new(Node::End))),
);

Bei rekursiven Typen kann die Größe des nächsten Werts nicht sofort zur Kompilierungszeit bekannt sein. Box platziert den Wert auf dem Heap und speichert einen Zeiger fester Größe im aktuellen Typ.

Die Box wird nicht automatisch geteilt und es gibt immer noch nur einen Haupteigentümer.

Rc und Arc

use std::rc::Rc;

let data = Rc::new(String::from("ItemTable"));
let ui_data = Rc::clone(&data);
let game_data = Rc::clone(&data);

Mit Rc können mehrere Stellen in einem einzelnen Thread denselben Wert besitzen. Die Werte werden bereinigt, wenn der letzte Rc verschwindet.

Für die gemeinsame Nutzung über mehrere Threads hinweg ist Arc erforderlich, das die Zählung atomarer Referenzen verwendet. Rc und Arc machen ihre internen Werte standardmäßig nicht veränderbar.

interne Variabilität

use std::cell::RefCell;
use std::rc::Rc;

let score = Rc::new(RefCell::new(0));
*score.borrow_mut() += 10;

RefCell prüft die Ausleihregeln zur Laufzeit, nicht zur Kompilierungszeit. Gleichzeitig gerät das Programm bei falscher Entlehnung in Panik, sodass die Kompilierungsprüfung nicht verschwindet.

Der Änderungszugriff wird normalerweise zwischen Threads mithilfe einer Kombination aus Arc und Mutex synchronisiert.

Wenn sich viele intelligente Hinweise überschneiden, wird es schwierig, die Eigentümerstruktur zu verstehen. Sie müssen zunächst den Zweck überprüfen, zu dem Box den Heap besitzt, Rc mit einem einzelnen Thread teilt und Arc zwischen Threads teilt, und den einfachsten Typ auswählen.