W Rust domyślną metodą do konwersji łańcucha na liczbę jest metoda parse(). Można ją zastosować do typów implementujących trait FromStr, na przykład do konwersji String lub &str na i32, f64 i inne.
Przykład:
let num: i32 = "42".parse().unwrap();
Jednak w przypadku niepoprawnego łańcucha występuje błąd (Result::Err). Ważne jest, aby obsługiwać wynik za pomocą match, aby uniknąć awarii aplikacji:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Liczba: {}", n), Err(e) => println!("Błąd parsowania: {}", e), }
Metoda parse obsługuje przeciążenie typów za pomocą "turbofish" (::<i32>), jeśli typ nie może być wnioskowany automatycznie.
Pytanie: Czy można wywołać .parse() bez wskazywania typu podczas kompilacji i uzyskać poprawny wynik?
Często odpowiadają: Tak, jeśli łańcuch zawiera liczbę.
Poprawna odpowiedź: Nie, podczas kompilacji typ, na jaki ma nastąpić konwersja, musi być znany. Jeśli typ nie jest wnioskowany (np. nie jest używany później jawnie), kompilator zgłosi błąd.
Przykład błędnego kodu:
let x = "10".parse(); // Błąd: niejasne, na jaki typ parsować
Aby to naprawić, użyj turbofisha:
let x = "10".parse::<i32>().unwrap();
Historia
W module parsowania konfiguracji pozostawiono .parse().unwrap() bez obsługi błędów. Jedna literówka w ustawieniu użytkownika prowadziła do panic! i zatrzymania całej aplikacji na produkcji.
Historia
W jednym projekcie programiści nie określali typu jawnie (nie używali turbofisha), a zmienna pośrednia nie była używana, dlatego kompilator nie mógł wywnioskować typu, co prowadziło do trudnej do uchwycenia błędu na etapie kompilacji.
Historia
W projekcie wystąpił błąd, ponieważ do parsowania dużej liczby z łańcucha przypadkowo użyto parse::<u8>, co prowadziło do błędu przepełnienia. Błąd odkryto dopiero po kilku tygodniach użytkowania, kiedy dane zostały utracone.