ps4 - rust traduccion
¿Convertir una cadena a int en Rust? (6)
Nota: ¡esta pregunta contiene un código anterior a 1.0 obsoleto! Sin embargo, la respuesta es correcta.
Para convertir un
str
en un
int
en Rust, puedo hacer esto:
let my_int = from_str::<int>(my_str);
La única forma en que sé cómo convertir una
String
en un
int
es obtener una porción de ella y luego usar
from_str
en ella de esta manera:
let my_int = from_str::<int>(my_string.as_slice());
¿Hay alguna manera de convertir directamente una
String
en un
int
?
Bueno no. ¿Por qué debería haber? Simplemente descarte la cadena si ya no la necesita.
&str
es más útil que
String
cuando solo necesita leer una cadena, porque es solo una vista del dato original, no su propietario.
Puede pasarlo más fácilmente que
String
, y es copiable, por lo que los métodos invocados no lo consumen.
En este sentido, es más general: si tiene un
String
, puede pasarlo a donde se espera un
&str
, pero si tiene
&str
, solo puede pasarlo a las funciones que esperan
String
si realiza una nueva asignación.
Puede encontrar más información sobre las diferencias entre estos dos y cuándo usarlos en la guía oficial de cadenas .
Con una noche reciente, puedes hacer esto:
let my_int = from_str::<int>(&*my_string);
Lo que sucede aquí es que
String
ahora se puede desreferenciar en un
str
.
Sin embargo, la función quiere un
&str
, por lo que tenemos que pedir prestado nuevamente.
Como referencia, creo que este patrón particular (
&*
) se llama "préstamo cruzado".
Puede convertir directamente a int utilizando el método
str::parse::<T>()
.
let my_string = "27".to_string(); // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();
Puede especificar el tipo para analizar con el operador de turbohélice (
::<>
) como se muestra arriba o mediante una anotación explícita de tipo:
let my_int: i32 = my_string.parse().unwrap();
Como se menciona en los comentarios,
parse()
devuelve un
Result
.
Este resultado será un
Err
si la cadena no se puede analizar como el tipo especificado (por ejemplo, la cadena
"peter"
no se puede analizar como
i32
).
Puede usar el método
from_str
del rasgo
from_str
, que se implementa para
i32
:
let my_num = i32::from_str("9").unwrap_or(0);
Si obtiene su cadena de
stdin().read_line
, primero debe recortarla.
let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!");
let my_u8: u8 = "42".parse::<u8>().unwrap();
let my_u32: u32 = "42".parse::<u32>().unwrap();
// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
Ok(n) => do_something_with(n),
Err(e) => weep_and_moan(),
}
parse
devuelve un
core::result::Result<u32, core::num::ParseIntError>
y
unwrap
"mueve el valor v fuera de la Opción si es Some (v) [o] Pánico si el valor propio es igual a Ninguno" .
parse
es una
función genérica
, de ahí el tipo entre paréntesis angulares.