Correspondência de Padrões Concisa em Rust com Let-Else

Beginner

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

Introdução

Neste laboratório, demonstra-se o uso de let-else em Rust, onde um padrão refutável pode corresponder e vincular variáveis no escopo circundante, ou divergir quando o padrão não corresponde usando instruções como break, return ou panic!. Esta construção permite código conciso e legível ao lidar com cenários de correspondência de padrões e tratamento de erros, eliminando a necessidade de repetir blocos de código ou usar instruções let externas.

Nota: Se o laboratório não especificar um nome de ficheiro, pode usar qualquer nome de ficheiro que desejar. Por exemplo, pode usar main.rs, compilá-lo e executá-lo com rustc main.rs && ./main.

let-else

Com let-else, um padrão refutável pode corresponder e vincular variáveis no escopo circundante como um let normal, ou divergir (por exemplo, break, return, panic!) quando o padrão não corresponde.

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!("Não é possível segmentar o par de itens de contagem: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Não é possível analisar o inteiro: '{count_str}'");
    };
    (count, item)
}

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

O escopo das ligações de nomes é o principal fator que diferencia isso de expressões match ou if let-else. Anteriormente, esses padrões podiam ser aproximados com uma repetição desnecessária e um 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!("Não é possível segmentar o par de itens de contagem: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Não é possível analisar o inteiro: '{count_str}'");
    };
        (count, item)
    }

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

Resumo

Parabéns! Você concluiu o laboratório Let-Else. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.