Option & Unwrap

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, nous allons découvrir l'énumération Option de la bibliothèque std de Rust, qui est utilisée pour gérer les cas où l'absence est possible. Elle propose deux options : Some(T) lorsqu'un élément de type T est trouvé, et None lorsqu'aucun élément n'est trouvé. Ces cas peuvent être traités explicitement à l'aide de match ou implicitement à l'aide de unwrap. Le traitement explicite permet un contrôle plus fin et des résultats plus significatifs, tandis que unwrap peut soit renvoyer l'élément interne soit entraîner une panique.

Note : Si le nom de fichier n'est pas spécifié dans le laboratoire, 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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/ErrorHandlingandDebuggingGroup(["Error Handling and Debugging"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/ErrorHandlingandDebuggingGroup -.-> rust/panic_usage("panic! Usage") subgraph Lab Skills rust/variable_declarations -.-> lab-99233{{"Option & Unwrap"}} rust/string_type -.-> lab-99233{{"Option & Unwrap"}} rust/function_syntax -.-> lab-99233{{"Option & Unwrap"}} rust/expressions_statements -.-> lab-99233{{"Option & Unwrap"}} rust/method_syntax -.-> lab-99233{{"Option & Unwrap"}} rust/panic_usage -.-> lab-99233{{"Option & Unwrap"}} end

Option & unwrap

Dans le dernier exemple, nous avons montré que nous pouvons provoquer une erreur dans le programme à volonté. Nous avons dit à notre programme de générer une panique si nous buvons un citronnade sucrée. Mais que se passe-t-il si nous attendons quelque boisson mais ne la recevons pas? Ce cas serait tout aussi mauvais, donc il doit être géré!

Nous pourrions tester cela contre la chaîne nulle (""), comme nous le faisons avec une citronnade. Puisque nous utilisons Rust, demandons plutôt au compilateur de signaler les cas où il n'y a pas de boisson.

Un enum appelé Option<T> dans la bibliothèque std est utilisé lorsque l'absence est possible. Il se manifeste sous l'une des deux "options" suivantes :

  • Some(T) : Un élément de type T a été trouvé
  • None : Aucun élément n'a été trouvé

Ces cas peuvent soit être traités explicitement via match soit implicitement avec unwrap. Le traitement implicite renverra soit l'élément interne soit générera une panique.

Notez qu'il est possible de personnaliser manuellement la panique avec expect, mais unwrap nous laisse dans les autres cas un résultat moins significatif que le traitement explicite. Dans l'exemple suivant, le traitement explicite produit un résultat plus contrôlé tout en conservant l'option de générer une panique si souhaité.

// L'adulte a vu tout et peut bien gérer n'importe quelle boisson.
// Toutes les boissons sont traitées explicitement à l'aide de `match`.
fn give_adult(drink: Option<&str>) {
    // Spécifiez une action pour chaque cas.
    match drink {
        Some("lemonade") => println!("Yuck! Trop sucré."),
        Some(inner)   => println!("{}? Comme c'est bon.", inner),
        None          => println!("Pas de boisson? Oh bien."),
    }
}

// Les autres vont générer une panique avant de boire des boissons sucrées.
// Toutes les boissons sont traitées implicitement à l'aide de `unwrap`.
fn drink(drink: Option<&str>) {
    // `unwrap` génère une panique lorsqu'il reçoit un `None`.
    let inside = drink.unwrap();
    if inside == "lemonade" { panic!("AAAaaaaa!!!!"); }

    println!("J'adore les {}!!!!!", inside);
}

fn main() {
    let water  = Some("water");
    let lemonade = Some("lemonade");
    let void  = None;

    give_adult(water);
    give_adult(lemonade);
    give_adult(void);

    let coffee = Some("coffee");
    let nothing = None;

    drink(coffee);
    drink(nothing);
}

Résumé

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