Super et Self

RustRustBeginner

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 explorons l'utilisation des mots clés super et self en Rust pour éliminer l'ambiguité et éviter les chemins codés en dur lors de l'accès à des éléments.

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/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data 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") subgraph Lab Skills rust/type_casting -.-> lab-99335{{"Super et Self"}} rust/function_syntax -.-> lab-99335{{"Super et Self"}} rust/expressions_statements -.-> lab-99335{{"Super et Self"}} rust/lifetime_specifiers -.-> lab-99335{{"Super et Self"}} rust/method_syntax -.-> lab-99335{{"Super et Self"}} end

super et self

Les mots clés super et self peuvent être utilisés dans le chemin pour éliminer l'ambiguité lors de l'accès à des éléments et pour éviter le codage en dur inutile des chemins.

fn function() {
    println!("appelé `function()`");
}

mod cool {
    pub fn function() {
        println!("appelé `cool::function()`");
    }
}

mod my {
    fn function() {
        println!("appelé `my::function()`");
    }

    mod cool {
        pub fn function() {
            println!("appelé `my::cool::function()`");
        }
    }

    pub fn indirect_call() {
        // Essayons d'accéder à toutes les fonctions nommées `function` à partir de ce scope!
        print!("appelé `my::indirect_call()`, qui\n> ");

        // Le mot clé `self` fait référence au scope du module actuel - dans ce cas `my`.
        // Appeler `self::function()` et appeler `function()` directement donnent
        // le même résultat, car ils font référence à la même fonction.
        self::function();
        function();

        // Nous pouvons également utiliser `self` pour accéder à un autre module à l'intérieur de `my`:
        self::cool::function();

        // Le mot clé `super` fait référence au scope parent (en dehors du module `my`).
        super::function();

        // Cela se lira à la `cool::function` dans le scope de la *crate*.
        // Dans ce cas, le scope de la crate est le scope le plus externe.
        {
            use crate::cool::function as root_function;
            root_function();
        }
    }
}

fn main() {
    my::indirect_call();
}

Sommaire

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