In Rust ist die Standardmethode zur Umwandlung eines Strings in eine Zahl die Methode parse(). Sie kann auf Typen angewendet werden, die das Trait FromStr implementieren, zum Beispiel zur Umwandlung von String oder &str in i32, f64 und andere.
Beispiel:
let num: i32 = "42".parse().unwrap();
Bei einem ungültigen String tritt ein Fehler auf (Result::Err). Es ist wichtig, das Ergebnis über match zu verarbeiten, um einen Crash der Anwendung zu vermeiden:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Zahl: {}", n), Err(e) => println!("Parsing-Fehler: {}", e), }
Die Methode parse unterstützt die Typüberladung über "turbofish" (::<i32>), wenn der Typ nicht implizit abgeleitet werden kann.
Frage: Kann man .parse() während der Kompilierung ohne Angabe des Typs aufrufen und ein korrektes Ergebnis erhalten?
Häufige Antwort: Ja, wenn der String eine Zahl enthält.
Richtige Antwort: Nein, zur Kompilierungszeit muss der Typ, in den umgewandelt werden soll, bekannt sein. Wenn der Typ nicht abgeleitet werden kann (z.B. nicht eindeutig später verwendet), gibt der Compiler einen Fehler aus.
Beispiel für fehlerhaften Code:
let x = "10".parse(); // Fehler: unklar, in welchen Typ zu parsen
Zur Behebung verwenden Sie turbofish:
let x = "10".parse::<i32>().unwrap();
Geschichte
Im Modul zur Parsing-Konfiguration wurde .parse().unwrap() ohne Fehlerbehandlung gelassen. Ein Tippfehler in der Benutzereinstellung führte zu panic! und stoppte die gesamte Anwendung in der Produktion.
Geschichte
In einem Projekt gaben die Entwickler den Typ nicht explizit an (verwendeten kein turbofish), und die Variable wurde zwischendurch nicht verwendet, sodass der Compiler den Typ nicht ableiten konnte, was zu einem schwer zu erfassenden Fehler während der Kompilierung führte.
Geschichte
In einem Projekt gab es einen Bug, weil zum Parsen einer großen Zahl aus einem String versehentlich parse::<u8> verwendet wurde, was zu einem Überlauf-Fehler führte. Der Fehler wurde erst einige Wochen nach der Nutzung entdeckt, als Daten verloren gingen.