Gestion de l'échec avec l'enum Option en Rust

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, vous allez découvrir l'enum Option<T> en Rust, qui fournit deux variantes (None et Some(value)) pour gérer l'échec ou l'absence de valeur dans un programme.

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/integer_types -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/type_casting -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/function_syntax -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/expressions_statements -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/lifetime_specifiers -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/method_syntax -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} rust/operator_overloading -.-> lab-99256{{"Gestion de l'échec avec l'enum Option en Rust"}} end

Option

Parfois, il est souhaitable de capturer l'échec de certaines parties d'un programme plutôt que d'appeler panic! ; cela peut être accompli en utilisant l'enum Option.

L'enum Option<T> a deux variantes :

  • None, pour indiquer l'échec ou l'absence de valeur, et
  • Some(value), une struct tuple qui encapsule une value de type T.
// Une division entière qui ne `panic!` pas
fn checked_division(dividende: i32, diviseur: i32) -> Option<i32> {
    if diviseur == 0 {
        // L'échec est représenté par la variante `None`
        None
    } else {
        // Le résultat est encapsulé dans une variante `Some`
        Some(dividende / diviseur)
    }
}

// Cette fonction gère une division qui peut ne pas réussir
fn try_division(dividende: i32, diviseur: i32) {
    // Les valeurs `Option` peuvent être comparées par motif, tout comme les autres enums
    match checked_division(dividende, diviseur) {
        None => println!("{} / {} a échoué!", dividende, diviseur),
        Some(quotient) => {
            println!("{} / {} = {}", dividende, diviseur, quotient)
        },
    }
}

fn main() {
    try_division(4, 2);
    try_division(1, 0);

    // Lier `None` à une variable nécessite une annotation de type
    let none: Option<i32> = None;
    let _equivalent_none = None::<i32>;

    let optional_float = Some(0f32);

    // Décapsuler une variante `Some` extraira la valeur encapsulée.
    println!("{:?} se décapsule en {:?}", optional_float, optional_float.unwrap());

    // Décapsuler une variante `None` provoquera un `panic!`
    println!("{:?} se décapsule en {:?}", none, none.unwrap());
}

Résumé

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