Super и Self

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы исследуем использование ключевых слов super и self в Rust для устранения двусмысленности и избегания жестко закодированных путей при доступе к элементам.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) 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 и Self"}} rust/function_syntax -.-> lab-99335{{"Super и Self"}} rust/expressions_statements -.-> lab-99335{{"Super и Self"}} rust/lifetime_specifiers -.-> lab-99335{{"Super и Self"}} rust/method_syntax -.-> lab-99335{{"Super и Self"}} end

super и self

Ключевые слова super и self могут использоваться в пути для устранения двусмысленности при доступе к элементам и предотвращения ненужного жесткого кодирования путей.

fn function() {
    println!("called `function()`");
}

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

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

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

    pub fn indirect_call() {
        // Давайте обратимся ко всем функциям с именем `function` из этого скоупа!
        print!("called `my::indirect_call()`, that\n> ");

        // Ключевое слово `self` ссылается на текущий модульный скоуп - в данном случае `my`.
        // Вызов `self::function()` и прямой вызов `function()` дают
        // один и тот же результат, потому что они ссылаются на одну и ту же функцию.
        self::function();
        function();

        // Мы также можем использовать `self` для доступа к другому модулю внутри `my`:
        self::cool::function();

        // Ключевое слово `super` ссылается на родительский скоуп (за пределами модуля `my`).
        super::function();

        // Это будет ссылаться на `cool::function` в скоупе *коробки*.
        // В данном случае скоуп коробки - это самый внешний скоуп.
        {
            use crate::cool::function as root_function;
            root_function();
        }
    }
}

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

Резюме

Поздравляем! Вы завершили лабораторную работу по Super и Self. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.