ProgrammazioneSviluppatore Rust

Как в Rust реализовано чтение и парсинг строк в числа (например, из String в i32)? Какие подводные камни существуют при использовании метода parse, и как корректно обрабатывать ошибки преобразования?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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 insidiosa.

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();

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


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.