Teil 12: Ownership
Lernziel: Besitz von Daten verstehen.
Voraussetzungen: Die vorherigen Lektionen, insbesondere Teil 11.
Worum geht es?
Ownership ist ein Kernprinzip von Rust. Jeder Wert hat einen Besitzer. Verlässt dieser seinen Gültigkeitsbereich, kann sein Speicher automatisch freigegeben werden.
Schritt für Schritt
fn main() {
let name1 = String::from("Neptune");
let name2 = name1; // Besitz wird übertragen (Move)
println!("{name2}");
// println!("{name1}"); // absichtlich ungültig
}
Bei String verschiebt die Zuweisung hier den Besitz. Der alte Name darf anschließend nicht mehr verwendet werden. Das verhindert eine doppelte Freigabe derselben Ressource.
Bei einfachen Typen wie i32 wird dagegen häufig kopiert:
let a = 12;
let b = a;
println!("{a} {b}");
Möchtest du ausdrücklich unabhängige String-Daten, kannst du clone() verwenden – das erzeugt eine Kopie und kann Speicher und Zeit kosten.
Drei Merksätze
- Ein Wert besitzt jeweils einen Eigentümer.
- Eine Besitzübertragung macht die alte Bindung unbrauchbar.
- Am Ende der Gültigkeit wird eine besessene Ressource aufgeräumt.
Diese vereinfachten Regeln reichen für den Einstieg; Referenzen folgen im nächsten Teil.
Selbst ausprobieren
Erzeuge einen String, übertrage ihn auf eine zweite Variable und versuche anschließend, die erste Variable zu verwenden. Lies die Compilerfehlermeldung.
Musterlösung anzeigen
fn main() {
let erster_name = String::from("X1C");
let zweiter_name = erster_name;
println!("{zweiter_name}");
// println!("{erster_name}"); // error: value borrowed after move
}
Alternative für zwei unabhängige Strings: let zweiter_name = erster_name.clone();.
Das solltest du mitnehmen
- Besitz von Daten verstehen.
- Nutze
cargo runfür das Ausführen undcargo checkfür eine schnelle Fehlerprüfung (ab Teil 4). - Experimentiere mit veränderten Werten und beobachte die Compilermeldungen.
