En Rust, el método estándar para convertir una cadena en un número es el método parse(). Se puede aplicar a tipos que implementan el rasgo FromStr, por ejemplo, para convertir String o &str en i32, f64 y otros.
Ejemplo:
let num: i32 = "42".parse().unwrap();
Sin embargo, si la cadena es incorrecta, se genera un error (Result::Err). Es importante manejar el resultado mediante match para evitar la caída de la aplicación:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Número: {}", n), Err(e) => println!("Error de análisis: {}", e), }
El método parse admite la sobrecarga de tipos a través de "turbofish" (::<i32>), si el tipo no se puede inferir implícitamente.
Pregunta: ¿Se puede llamar a .parse() sin especificar el tipo durante la compilación y obtener un resultado correcto?
Respuesta frecuente: Sí, si la cadena contiene un número.
Respuesta correcta: No, durante la compilación el tipo al que se está convirtiendo debe ser conocido. Si el tipo no se puede inferir (por ejemplo, no se utiliza explícitamente más adelante), el compilador dará un error.
Ejemplo de código incorrecto:
let x = "10".parse(); // Error: no está claro a qué tipo parsear
Para corregirlo, utiliza turbofish:
let x = "10".parse::<i32>().unwrap();
Historia
En el módulo de análisis de configuración dejaron .parse().unwrap() sin manejo de errores. Un error tipográfico en la configuración del usuario provocaba un panic! y detenía toda la aplicación en producción.
Historia
En un proyecto, los desarrolladores no especificaron el tipo explícitamente (no utilizaron turbofish), y la variable intermedia no se aplicaba, por lo que el compilador no podía inferir el tipo, lo que provocó un error difícil de detectar en la etapa de compilación.
Historia
En un proyecto se produjo un error debido a que para analizar un número grande de la cadena se aplicó accidentalmente parse::<u8>, lo que provocó un error de desbordamiento. El error se detectó solo semanas después de su uso, cuando se habían perdido datos.