Interacción con el entorno y datos del usuario

Clase 19 de 20Curso 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.