Kompakte Rust-Option-Iteration mit while let

Beginner

This tutorial is from open-source community. Access the source code

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.rs verwenden und es mit rustc main.rs &&./main kompilieren 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.