Einführung
Eine Variable speichert einen Wert. Viele Programme benötigen jedoch eine geordnete Liste, deren Länge sich ändern kann. Rusts Vec<T> ist eine wachsende Sequenz: Jedes Element hat den Typ T, die Werte behalten ihre Reihenfolge bei und der Vektor besitzt seine Elemente.
Sie erstellen eine Café-Bestellliste, lesen sicher eine Position aus, durchlaufen jede Bestellung, ohne die Liste zu verbrauchen, und aktualisieren jeden gespeicherten String über veränderliche Referenzen.
Einen Vektor erstellen und erweitern
In diesem Schritt fügen Sie einem zunächst leeren Vektor drei eigene Strings hinzu.
Wechseln Sie in das vorbereitete Projekt und öffnen Sie den Quellcode:
cd /home/labex/project/cafe-orders
nano src/main.rs
Die Deklaration Vec<String> bedeutet „ein Vektor, dessen Elemente eigene String-Werte sind“. Dies ist dieselbe Container-Schreibweise mit spitzen Klammern, die Sie bei Option<u32> gesehen haben: Hier ist der enthaltene Elementtyp String. In der späteren Laboreinheit zu Generics lernen Sie, wie Sie solche wiederverwendbaren Typen definieren. Vec::new() erstellt den Vektor leer. Die Bindung ist mut, weil das Hinzufügen von Elementen den Vektor verändert.
Ersetzen Sie den Kommentar für Schritt 1 durch drei push-Aufrufe:
orders.push(String::from("Latte"));
orders.push(String::from("Tea"));
orders.push(String::from("Cake"));
push hängt ein Element am Ende an und behält dabei die Einfügereihenfolge bei. Speichern Sie mit Ctrl+O, drücken Sie Enter und beenden Sie den Editor mit Ctrl+X. Prüfen und starten Sie das Programm:
cargo check
cargo run --quiet
Die Ausgabe sollte wie folgt aussehen:
Order count: 3
Orders: ["Latte", "Tea", "Cake"]
len() meldet drei Elemente. Der Platzhalter :? verwendet Rusts Debug-Formatierung, um den vollständigen Vektor anzuzeigen, einschließlich der Anführungszeichen um die Strings.
Sicher auf eine Position zugreifen
In diesem Schritt lesen Sie die zweite Position des Vektors aus, ohne einen Panic-Fehler durch einen ungültigen Index zu riskieren.
Vektorpositionen beginnen bei null. Daher verweist der Index 1 auf die zweite Bestellung. Die Methode get gibt ein Option<&String> zurück: Some enthält eine gemeinsam genutzte Referenz, wenn die Position vorhanden ist, und None steht für eine fehlende Position. Über die Referenz können Sie das Element lesen, während der Vektor dessen Besitzer bleibt.
Öffnen Sie den Quellcode:
nano src/main.rs
Ersetzen Sie den Kommentar für Schritt 2 durch:
match orders.get(1) {
Some(order) => println!("Second order: {order}"),
None => println!("Second order: missing"),
}
Damit lesen Sie das Element, ohne seinen String aus dem Vektor zu verschieben. Speichern und beenden Sie den Editor. Starten Sie anschließend das Programm:
cargo run --quiet
Am Ende sollte eine neue Zeile erscheinen:
Second order: Tea
Diese Zeile zeigt, dass die Position 1 vorhanden ist und die Einfügereihenfolge erhalten blieb.
Mit einer gemeinsam genutzten Referenz iterieren
In diesem Schritt durchlaufen Sie jede Bestellung, während der Vektor anschließend weiter verfügbar bleibt.
Wenn Sie &orders schreiben, leihen Sie den Vektor aus, anstatt ihn in die for-Schleife zu verschieben. Jeder Schleifenwert ist daher eine gemeinsam genutzte Referenz auf einen gespeicherten String.
Öffnen Sie den Quellcode:
nano src/main.rs
Ersetzen Sie den Kommentar für Schritt 3 durch diese Schleife und die anschließende Prüfung:
for order in &orders {
println!("Queued: {order}");
}
println!("Stored after display: {}", orders.len());
Speichern und beenden Sie den Editor. Starten Sie anschließend das Programm:
cargo run --quiet
Die neuen Zeilen sollten wie folgt aussehen:
Queued: Latte
Queued: Tea
Queued: Cake
Stored after display: 3
Die abschließende Anzahl kann nach der Schleife verwendet werden, weil die Schleife den Vektor nur ausgeliehen und jede gemeinsam genutzte Referenz vor dem nächsten Durchlauf zurückgegeben hat.
Über veränderliche Referenzen aktualisieren
In diesem Schritt leihen Sie jedes Vektorelement veränderlich aus und aktualisieren es direkt, bevor die Ausgabeschleife ausgeführt wird.
Für einen Wert darf immer nur eine veränderliche Referenz gleichzeitig aktiv sein. Eine for-Schleife über &mut orders erfüllt diese Regel, indem sie jeweils eine veränderliche Referenz auf ein Element liefert, diese für den aktuellen Durchlauf verwendet und anschließend zum nächsten Element wechselt.
Öffnen Sie den Quellcode:
nano src/main.rs
Ersetzen Sie den Kommentar für Schritt 4 durch:
for order in &mut orders {
order.push_str(" - ready");
}
push_str hängt geliehenen Text an jeden eigenen String an. Rust verwendet für diesen Methodenaufruf automatisch den veränderlichen String, auf den die jeweilige Referenz zeigt.
Speichern und beenden Sie den Editor. Prüfen und starten Sie anschließend das Programm:
cargo check
cargo run --quiet
Die vollständige Ausgabe sollte wie folgt aussehen:
Order count: 3
Orders: ["Latte", "Tea", "Cake"]
Second order: Tea
Queued: Latte - ready
Queued: Tea - ready
Queued: Cake - ready
Stored after display: 3
Die aktualisierten Warteschlangen-Zeilen zeigen, dass sich alle Elemente direkt im Vektor geändert haben. Die abschließende Anzahl bestätigt, dass der Vektor weiterhin dieselben drei Strings besitzt.
Zusammenfassung
Sie haben einen Vec<String> erstellt und erweitert, mit get sicher auf eine Position zugegriffen, den Vektor durchlaufen, ohne ihn zu verbrauchen, und jedes Element über veränderliche Referenzen aktualisiert.


