Zum Inhalt springen

Der ?-Operator

Gegeben sei ein beliebiger Ausdruck e vom Typ Result<T, E>. Welcher Code-Snippet stellt am besten dar, wie e? übersetzt wird?

Wenn e ein Result ist, extrahiert e? den Wert innerhalb von Ok, falls möglich, andernfalls wird der Err-Wert aus der aktuellen Funktion zurückgegeben.


// Angenommen, hello.txt enthält den Inhalt "will"
fn read_username_from_file() -> Option<String> {
let mut username_file = File::open("hello.txt")?;
let mut username = String::new();
username_file.read_to_string(&mut username)?;
Some(username)
}
fn main() {
println!("{}", read_username_from_file().unwrap());
}

File::open gibt ein Result zurück, aber der Rückgabetyp von read_username_from_file erwartet ein Option. Daher ist es ungültig, den ?-Operator zu verwenden, bevor das Result in ein Option umgewandelt wurde (z.B. mit der Methode Result::ok).