Coincidencia de patrones concisa en Rust con Let-Else

Beginner

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

Introducción

En este laboratorio, se demuestra el uso de let-else en Rust, donde un patrón refutable puede coincidir y enlazar variables en el ámbito circundante, o en su defecto diverger cuando el patrón no coincide mediante el uso de declaraciones como break, return o panic!. Esta construcción permite un código conciso y legible al tratar con casos de coincidencia de patrones y manejo de errores, eliminando la necesidad de repetir bloques de código o usar declaraciones let externas.

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.

let-else

Con let-else, un patrón refutable puede coincidir y enlazar variables en el ámbito circundante como un let normal, o en su defecto diverger (por ejemplo, break, return, panic!) cuando el patrón no coincide.

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
        panic!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}

fn main() {
    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}

El ámbito de enlaces de nombres es lo principal que los distingue de las expresiones match o if let-else. Anteriormente, se podía aproximar estos patrones con una desagradable cantidad de repetición y un let externo:

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (count_str, item) = match (it.next(), it.next()) {
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Can't parse integer: '{count_str}'");
    };
        (count, item)
    }

    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));

Resumen

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