In Rust, il metodo standard per convertire una stringa in un numero è il metodo parse(). Può essere applicato a tipi che implementano il trait FromStr, ad esempio, per convertire String o &str in i32, f64 e altri.
Esempio:
let num: i32 = "42".parse().unwrap();
Tuttavia, in caso di una stringa non valida, si verifica un errore (Result::Err). È importante gestire il risultato tramite match per evitare il crash dell'applicazione:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Numero: {}", n), Err(e) => println!("Errore di parsing: {}", e), }
Il metodo parse supporta l'overload dei tipi attraverso "turbofish" (::<i32>), se il tipo non può essere dedotto implicitamente.
Domanda: È possibile chiamare .parse() senza specificare il tipo durante la compilazione e ottenere un risultato corretto?
Spesso si risponde: Sì, se la stringa contiene un numero.
Risposta corretta: No, durante la compilazione il tipo in cui si effettua la conversione deve essere noto. Se il tipo non può essere dedotto (ad esempio, non è utilizzato esplicitamente in seguito), il compilatore genererà un errore.
Esempio di codice errato:
let x = "10".parse(); // Errore: tipo non chiaro su cui fare il parsing
Per correggere, utilizza turbofish:
let x = "10".parse::<i32>().unwrap();
Storia
Nel modulo di parsing della configurazione, hanno lasciato .parse().unwrap() senza gestire l'errore. Un errore di battitura nelle impostazioni utente ha portato a un panic! e all'arresto dell'intera applicazione in produzione.
Storia
In un progetto, gli sviluppatori non specificavano il tipo esplicitamente (non utilizzavano turbofish), e la variabile intermedia non veniva utilizzata, quindi il compilatore non riusciva a dedurre il tipo, causando un errore difficile da rilevare in fase di compilazione.
Storia
In un progetto è emerso un bug a causa del fatto che per il parsing di un grande numero da una stringa hanno accidentalmente applicato parse::<u8>, il che ha portato a un errore di overflow. L'errore è stato scoperto solo dopo alcune settimane di utilizzo, quando erano stati persi dati.