Rust proporciona herramientas estándar convenientes para convertir cadenas en números a través del rasgo FromStr. El método más comúnmente utilizado es .parse::<T>(), que se puede invocar en cadenas y rebanadas.
En muchos lenguajes, la conversión de cadenas a números es una tarea habitual, pero en Rust se realiza de la manera más segura y transparente posible; los errores de manejo forman parte del contrato de la biblioteca estándar, no excepciones en tiempo de ejecución.
.parse::<T>() devuelve un resultado del tipo Result<T, ParseIntError> (o similar para otros tipos), lo que obliga a manejar explícitamente los fracasos. Un error común es ignorar la posibilidad de error, utilizando unwrap() sin análisis, lo que puede causar que el programa se bloquee ante una entrada incorrecta en lugar de dar un mensaje de error adecuado.
Para convertir cadenas, se utiliza el método parse. Su firma es:
let num: i32 = "42".parse().unwrap();
Pero es mejor manejar el error:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("Número obtenido: {}", n), Err(e) => println!("Error de análisis: {e}"), }
Características clave:
FromStr, pero las restricciones específicas no son obvias: los espacios, los signos y el desbordamiento se manejan de diferentes maneras.Result, no a través de pánicos o excepciones.FromStr (incluyendo personalizados) puede ser el objetivo de .parse().¿Se puede usar parse sin especificar el tipo de resultado?
No, sin especificar el tipo (o sin la inferencia de tipo), Rust dará un error, ya que no entiende a qué tipo convertir.
¿Qué sucede si se intenta analizar una cadena con contenido no numérico a un número?
El método devolverá un error (Err(...)), no provocará un pánico. El error implementa el rasgo Debug, lo que es conveniente para la salida.
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
¿Se puede usar unwrap después de parse, si se está seguro del contenido?
Técnicamente, se puede, pero es un antipatrón. Si la cadena resulta ser inesperadamente no válida, el programa fallará abruptamente.
unwrap() sin manejo de errores.trim antes de la conversión, si la entrada es del usuario.parse::<String>()) en lugar del tipo numérico objetivo.Una utilidad de consola lee un número del usuario y utiliza .parse().unwrap(). Ante una entrada incorrecta accidental, el programa se bloquea de repente, y el usuario no entiende la razón.
Pros:
Contras:
La entrada se limpia de espacios al principio y se usa parse en un escenario con match o, si es necesario, map_err para devolver su error. Los errores se manejan correctamente, y se emite un mensaje de error claro.
Pros:
Contras: