Optionen mit? entpacken

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 untersuchen wir die Verwendung des ?-Operators in Rust, mit dem man Option-Werte einfach entpacken kann, ohne dass geschachtelte match-Anweisungen erforderlich sind. Der ?-Operator kann verwendet werden, um den zugrunde liegenden Wert schnell zurückzugeben, wenn die Option Some ist, oder die Funktion zu beenden und None zurückzugeben, wenn die Option None ist. Dieser Operator kann verkettet werden, um den Code lesbarer und präziser zu machen.

Hinweis: Wenn im Lab kein Dateiname angegeben ist, 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.

Entpacken von Optionen mit ?

Sie können Options mithilfe von match-Anweisungen entpacken, aber es ist oft einfacher, den ?-Operator zu verwenden. Wenn x eine Option ist, dann wird die Auswertung von x? den zugrunde liegenden Wert zurückgeben, wenn x Some ist, andernfalls wird die Funktion, die ausgeführt wird, abgebrochen und None zurückgegeben.

fn next_birthday(current_age: Option<u8>) -> Option<String> {
    // Wenn `current_age` `None` ist, wird `None` zurückgegeben.
    // Wenn `current_age` `Some` ist, wird der innere `u8` an `next_age` zugewiesen
    let next_age: u8 = current_age? + 1;
    Some(format!("Next year I will be {}", next_age))
}

Sie können mehrere ? hintereinander verketten, um Ihren Code viel lesbarer zu machen.

struct Person {
    job: Option<Job>,
}

#[derive(Clone, Copy)]
struct Job {
    phone_number: Option<PhoneNumber>,
}

#[derive(Clone, Copy)]
struct PhoneNumber {
    area_code: Option<u8>,
    number: u32,
}

impl Person {

    // Holt die Vorwahl der Telefonnummer des Jobs der Person, wenn vorhanden.
    fn work_phone_area_code(&self) -> Option<u8> {
        // Ohne den `?`-Operator bräuchten hier viele geschachtelte `match`-Anweisungen.
        // Es würde viel mehr Code benötigen - versuchen Sie es selbst zu schreiben und sehen Sie,
        // welche Variante einfacher ist.
        self.job?.phone_number?.area_code
    }
}

fn main() {
    let p = Person {
        job: Some(Job {
            phone_number: Some(PhoneNumber {
                area_code: Some(61),
                number: 439222222,
            }),
        }),
    };

    assert_eq!(p.work_phone_area_code(), Some(61));
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab "Entpacken von Optionen mit ?" abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.