Einführung
In diesem Lab wird die Verwendung von while let in Rust als eine kompaktere und effizientere Alternative zu der Verwendung von match-Sequenzen bei der Inkrementierung von Variablen oder der Iteration über Option-Typen demonstriert.
Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie
main.rsverwenden und es mitrustc main.rs &&./mainkompilieren und ausführen.
while let
Ähnlich wie if let kann while let unbequeme match-Sequenzen erträglicher machen. Betrachten Sie die folgende Sequenz, die i inkrementiert:
// Erstellt eine `Option<i32>`-Variable `optional` mit dem Wert `Some(0)`
let mut optional = Some(0);
// Wiederholt diesen Test.
loop {
match optional {
// Wenn `optional` zerlegt werden kann, wird der Block ausgewertet.
Some(i) => {
if i > 9 {
println!("Größer als 9, abbrechen!");
optional = None;
} else {
println!("`i` ist `{:?}`. Noch einmal versuchen.", i);
optional = Some(i + 1);
}
// ^ Benötigt 3 Einzüge!
},
// Beendet die Schleife, wenn die Zerlegung fehlschlägt:
_ => { break; }
// ^ Warum sollte dies erforderlich sein? Es muss eine bessere Möglichkeit geben!
}
}
Mit while let wird diese Sequenz viel schöner:
fn main() {
// Erstellt eine `Option<i32>`-Variable `optional` mit dem Wert `Some(0)`
let mut optional = Some(0);
// Dies liest: "Solange `let` `optional` in `Some(i)` zerlegt,
// wird der Block (`{}`) ausgewertet. Andernfalls `break`."
while let Some(i) = optional {
if i > 9 {
println!("Größer als 9, abbrechen!");
optional = None;
} else {
println!("`i` ist `{:?}`. Noch einmal versuchen.", i);
optional = Some(i + 1);
}
// ^ Weniger Rechtsverschiebung und erfordert nicht,
// den fehlgeschlagenen Fall explizit zu behandeln.
}
// ^ `if let` hatte zusätzliche optionale `else`/`else if`
// Klauseln. `while let` hat diese nicht.
}
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das While Let Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.