Disambiguïsation des traits imbriqués

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 discute du problème de la disambiguïsation des traits imbriqués, où deux traits ont des méthodes avec le même nom et des types de retour potentiellement différents.

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/AdvancedTopicsGroup(["Advanced Topics"]) 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/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") 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/traits("Traits") subgraph Lab Skills rust/variable_declarations -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/integer_types -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/string_type -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/type_casting -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/function_syntax -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/expressions_statements -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/lifetime_specifiers -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/method_syntax -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} rust/traits -.-> lab-99222{{"Disambiguïsation des traits imbriqués"}} end

Disambiguïsation des traits imbriqués

Un type peut implémenter de nombreux traits différents. Et si deux traits ont le même nom? Par exemple, de nombreux traits pourraient avoir une méthode nommée get(). Ils pourraient même avoir des types de retour différents!

Bonne nouvelle : puisque chaque implémentation de trait a son propre bloc impl, il est clair lequel des get de trait vous implémentez.

Et quand il est temps d'appeler ces méthodes? Pour les distinguer, nous devons utiliser la syntaxe Qualifiée en Toutes Longueurs.

trait UsernameWidget {
    // Récupérer le nom d'utilisateur sélectionné dans ce widget
    fn get(&self) -> String;
}

trait AgeWidget {
    // Récupérer l'âge sélectionné dans ce widget
    fn get(&self) -> u8;
}

// Un formulaire avec à la fois un UsernameWidget et un AgeWidget
struct Form {
    username: String,
    age: u8,
}

impl UsernameWidget for Form {
    fn get(&self) -> String {
        self.username.clone()
    }
}

impl AgeWidget for Form {
    fn get(&self) -> u8 {
        self.age
    }
}

fn main() {
    let form = Form {
        username: "rustacean".to_owned(),
        age: 28,
    };

    // Si vous décommentez cette ligne, vous obtiendrez une erreur disant
    // "multiple `get` found". Parce que, après tout, il y a plusieurs méthodes
    // nommées `get`.
    // println!("{}", form.get());

    let username = <Form as UsernameWidget>::get(&form);
    assert_eq!("rustacean".to_owned(), username);
    let age = <Form as AgeWidget>::get(&form);
    assert_eq!(28, age);
}

Résumé

Félicitations! Vous avez terminé le laboratoire Disambiguïsation des traits imbriqués. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.