Interacción con el entorno y datos del usuario
Clase 19 de 20 • Curso de Rust básico
Resumen
Rust es un lenguaje con una curva de dificultad importante cuando se trata de manipular tipos de datos. Puede ser un dolor de cabeza, así que veamos algunos consejos extras.
Accediendo al índice de un vector
Cuando recorras un array con un for
, a veces es interesante saber en qué índice de iteración estamos. Con un simple modificación, puedes obtener este dato en cada iteración.
fn main() {
let mut my_arr: Vec<String> = Vec::new();
my_arr.push("Primer valor".to_string());
my_arr.push("Segundo valor".to_string());
my_arr.push("Tercer valor".to_string());
for (index, word) in my_arr.iter().enumerate() {
println!("{} {}", index, word);
}
}
Con .iter().enumerate()
obtienes el index
como primer valor de un ciclo for
, y el valor en cuestión en el segundo parámetro. Así, ya puedes aplicar una lógica determinada si el índice es par o impar, por ejemplo.
Option, Some y None
Estas tres palabras reservadas se utilizan muchísimo en Rust y tienes que comprender su funcionamiento para sacarle el máximo provecho y entender qué está sucediendo en tu código.
Recordemos por un momento que Option<T>
puede devolver un valor determinado como Some
, o puede devolver un tipo de dato None
, pero que este es distinto de null. En Rust, el valor nulo simplemente no existe.
fn dividir_numeros(numerador: i128, denominador: i128) -> Option<i128> {
if denominador == 0 {
None
} else {
Some(numerador / denominador)
}
}
fn main() {
if let Some(result) = dividir_numeros(10, 2) {
println!("El resultado es: {}", result)
} else {
println!("No puedes dividir por cero");
}
}
En este ejemplo, la función dividir_numeros()
evaluará el denominador y, si este es cero, retornara un None
, de lo contrario, devolverá el resultado de la división y puedes validar este directamente en el if let Some(result) ...
para crear la variable si la función devolvió un Some
y luego mostrar la misma.
Otra forma de validar un Option
ya sea por Some
o None
es con la palabra reservada match
:
fn dividir_numeros(numerador: i128, denominador: i128) -> Option<i128> {
if denominador == 0 {
None
} else {
Some(numerador / denominador)
}
}
fn main() {
let result = dividir_numeros(10, 2);
match result {
Some(value) => { println!("El resultado es: {}", value) },
None => { println!("No puedes dividir por cero"); },
}
}
match
evaluará el resultado de la función por Some
o por None
, ejecutando el código según corresponda.
Estos conceptos realmente requieren de tiempo y paciencia para comprender. Si vienes de lenguajes como C++, tal vez te sientas algo familiarizado con la utilización de los caracteres &
o de un *
, pasajes por valor o referencia. Apóyate siempre de la documentación oficial de Rust para comprender cómo se utiliza cada característica y por qué.
Contribución creada por: Kevin Fiorentino.