Correspondance de motifs Rust concise avec Let-Else

RustRustBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, on démontre l'utilisation de let-else en Rust, où un motif réfutable peut correspondre et lier des variables dans la portée environnante, ou sinon diverger lorsque le motif ne correspond pas en utilisant des instructions telles que break, return ou panic!. Cette construction permet d'avoir un code concis et lisible lorsqu'il s'agit de traiter des scénarios de correspondance de motifs et de gestion d'erreurs, éliminant la nécessité de répéter des blocs de code ou d'utiliser des instructions let externes.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.

let-else

Avec let-else, un motif réfutable peut correspondre et lier des variables dans la portée environnante comme un let normal, ou sinon diverger (par exemple break, return, panic!) lorsque le motif ne correspond pas.

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"));
}

La portée des liaisons de nom est la principale chose qui le différencie des expressions match ou if let-else. Précédemment, vous pourriez approcher ces motifs avec un peu de répétition malheureuse et un let externe :

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"));

Résumé

Félicitations ! Vous avez terminé le laboratoire Let-Else. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.