Kurzweilige Rust-Musterabgleich mit Let-Else

RustRustBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab wird die Verwendung von let-else in Rust demonstriert, wobei ein widerlegbarer Muster Variablen im umgebenden Gültigkeitsbereich abgleichen und binden kann, oder andernfalls bei einem nicht übereinstimmenden Muster durch Verwendung von Anweisungen wie break, return oder panic! divergieren kann. Dieser Aufbau ermöglicht es, bei der Behandlung von Musterabgleich und Fehlerbehandlungsszenarien kompakte und lesbare Code zu schreiben, wodurch die Wiederholung von Codeblöcken oder die Verwendung von äußeren let-Anweisungen entfällt.

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.

let-else

Mit let-else kann ein widerlegbares Muster wie ein normales let Variablen im umgebenden Gültigkeitsbereich abgleichen und binden, oder andernfalls divergieren (z.B. break, return, panic!), wenn das Muster nicht übereinstimmt.

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
        panic!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}

fn main() {
    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}

Der Gültigkeitsbereich der Namensbindungen ist das Wesentliche, was dieses von match- oder if let-else-Ausdrücken unterscheidet. Früher konnten Sie diese Muster mit einem unglücklichen Wiederholungsanteil und einem äußeren let annähern:

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (count_str, item) = match (it.next(), it.next()) {
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Can't parse integer: '{count_str}'");
    };
        (count, item)
    }

    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Let-Else-Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.