Rust bietet bequeme Standardmittel zum Umwandeln von Strings in Zahlen über das Trait FromStr. Am häufigsten wird die Methode .parse::<T>() verwendet, die auf Strings und Slices aufgerufen werden kann.
In vielen Programmiersprachen ist die Umwandlung eines Strings in eine Zahl eine alltägliche Aufgabe, aber in Rust geschieht dies so sicher und transparent wie möglich. Fehler in der Verarbeitung sind Teil des Vertrages der Standardbibliothek und nicht Ausnahmen zur Laufzeit.
.parse::<T>() gibt ein Ergebnis vom Typ Result<T, ParseIntError> (oder ein ähnliches für andere Typen) zurück, was dazu zwingt, Fehlschläge explizit zu behandeln. Ein häufiger Fehler besteht darin, die Möglichkeit eines Fehlers zu ignorieren und unwrap() ohne Analyse zu verwenden, was zum Absturz des Programms bei ungültigen Eingabedaten führt, anstatt eine angemessene Fehlermeldung zu erhalten.
Zum Parsen von Strings wird die Methode parse verwendet. Ihre Signatur lautet:
let num: i32 = "42".parse().unwrap();
Besser ist es jedoch, den Fehler zu verarbeiten:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("Erhaltene Zahl: {}", n), Err(e) => println!("Parsing-Fehler: {e}"), }
Wichtige Merkmale:
FromStr implementiert, aber die genauen Einschränkungen sind implizit: Leerzeichen, Vorzeichen, Überläufe werden unterschiedlich behandelt.Result zurückgegeben und nicht durch Panic oder Ausnahme.FromStr (einschließlich benutzerdefinierter) kann Ziel von .parse() sein.Kann man parse ohne Angabe des Ergebnistyps verwenden?
Nein, ohne Typangabe (oder implizite Typableitung) gibt Rust einen Fehler aus, weil es nicht versteht, in welchen Typ konvertiert werden soll.
Was passiert, wenn man versucht, einen String mit nicht-numerischem Inhalt in eine Zahl zu parsen?
Die Methode gibt einen Fehler zurück (Err(...)), löst jedoch keine Panic aus. Der Fehler implementiert das Trait Debug, was für die Ausgabe praktisch ist.
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
Kann man unwrap nach parse verwenden, wenn man sich des Inhalts sicher ist?
Technisch möglich, aber es ist ein Anti-Pattern. Wenn der String unerwartet ungültig ist, stürzt das Programm ab.
unwrap() ohne Fehlerbehandlungtrim, bevor man umwandelt, wenn die Eingabe vom Benutzer kommtparse::<String>()) anstelle des ZielnummerntypsEin Konsolenwerkzeug liest eine Zahl vom Benutzer und verwendet .parse().unwrap(). Bei zufälliger falscher Eingabe stürzt das Programm plötzlich ab, der Benutzer versteht den Grund nicht.
Vorteile:
Nachteile:
Die Eingabe wird zunächst von Leerzeichen bereinigt, und parse wird in einem Match-Szenario verwendet oder falls nötig — map_err zur Rückgabe eines eigenen Fehlers. Fehler werden korrekt behandelt, und es wird eine klare Fehlermeldung ausgegeben.
Vorteile:
Nachteile: