作用域与遮蔽

RustRustBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习Rust中的变量绑定、其作用域以及遮蔽(shadowing)概念。变量绑定局限于一个代码块,代码块是由花括号括起来的一组语句。这里提供了两个示例来说明这些概念。第一个示例展示了在代码块内声明的变量绑定如何局限于该代码块的作用域,并且在其外部不可访问。第二个示例演示了变量遮蔽,即在代码块内声明一个具有相同名称的新绑定,实际上遮蔽了外部绑定。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 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/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/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99292{{"作用域与遮蔽"}} rust/string_type -.-> lab-99292{{"作用域与遮蔽"}} rust/function_syntax -.-> lab-99292{{"作用域与遮蔽"}} rust/expressions_statements -.-> lab-99292{{"作用域与遮蔽"}} rust/lifetime_specifiers -.-> lab-99292{{"作用域与遮蔽"}} end

作用域与遮蔽

变量绑定具有作用域,并且被限制在一个 代码块 中。代码块是由花括号 {} 括起来的一组语句。

fn main() {
    // 这个绑定存在于main函数中
    let long_lived_binding = 1;

    // 这是一个代码块,其作用域比main函数小
    {
        // 这个绑定只存在于这个代码块中
        let short_lived_binding = 2;

        println!("内部短生命周期变量: {}", short_lived_binding);
    }
    // 代码块结束

    // 错误!`short_lived_binding` 在此作用域中不存在
    println!("外部短生命周期变量: {}", short_lived_binding);
    // FIXME ^ 注释掉这一行

    println!("外部长生命周期变量: {}", long_lived_binding);
}

此外,变量遮蔽是允许的。

fn main() {
    let shadowed_binding = 1;

    {
        println!("被遮蔽之前: {}", shadowed_binding);

        // 这个绑定 *遮蔽* 了外部的绑定
        let shadowed_binding = "abc";

        println!("在内部代码块中被遮蔽: {}", shadowed_binding);
    }
    println!("在内部代码块外部: {}", shadowed_binding);

    // 这个绑定 *遮蔽* 了之前的绑定
    let shadowed_binding = 2;
    println!("在外部代码块中被遮蔽: {}", shadowed_binding);
}

总结

恭喜你!你已经完成了“作用域与遮蔽”实验。你可以在LabEx中练习更多实验来提升你的技能。