Iteración concisa de Option en Rust con While Let

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, se demuestra el uso de while let en Rust como una alternativa más concisa y eficiente al uso de secuencias match al incrementar variables o iterar sobre tipos Option.

Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.

while let

Similar a if let, while let puede hacer que las secuencias match incómodas sean más tolerables. Considere la siguiente secuencia que incrementa i:

// Hacer `optional` del tipo `Option<i32>`
let mut optional = Some(0);

// Intentar repetidamente esta prueba.
loop {
    match optional {
        // Si `optional` se desestructura, evaluar el bloque.
        Some(i) => {
            if i > 9 {
                println!("Mayor que 9, salir!");
                optional = None;
            } else {
                println!("`i` es `{:?}`. Intentar de nuevo.", i);
                optional = Some(i + 1);
            }
            // ^ Requiere 3 sangrías!
        },
        // Salir del bucle cuando la desestructuración falla:
        _ => { break; }
        // ^ ¿Por qué debería ser necesario esto? Debe haber una mejor manera!
    }
}

Usar while let hace que esta secuencia sea mucho mejor:

fn main() {
    // Hacer `optional` del tipo `Option<i32>`
    let mut optional = Some(0);

    // Esto se lee: "mientras `let` desestructura `optional` en
    // `Some(i)`, evaluar el bloque (`{}`). En caso contrario `break`.
    while let Some(i) = optional {
        if i > 9 {
            println!("Mayor que 9, salir!");
            optional = None;
        } else {
            println!("`i` es `{:?}`. Intentar de nuevo.", i);
            optional = Some(i + 1);
        }
        // ^ Menos desplazamiento hacia la derecha y no requiere
        // manejar explícitamente el caso de falla.
    }
    // ^ `if let` tenía cláusulas `else`/`else if` adicionales opcionales. `while let` no tiene estas.
}

Resumen

¡Felicidades! Has completado el laboratorio While Let. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.