- 可见性
可见性
项(item)默认情况下拥有私有的可见性(private visibility),不过可以加上 pub
(public 的前 3 个字母)修饰语(modifier)来改变默认行为。一个模块之外的作用域只能访问该模块里面的公有项(public item)。
// 一个名为 `my` 的模块
mod my {
// 在模块中的项默认带有私有可见性。
fn private_function() {
println!("called `my::private_function()`");
}
// 使用 `pub` 修饰语来改变默认可见性。
pub fn function() {
println!("called `my::function()`");
}
// 在同一模块中,项可以访问其它项,即使是私有属性。
pub fn indirect_access() {
print!("called `my::indirect_access()`, that\n> ");
private_function();
}
// 项也可以嵌套。
pub mod nested {
pub fn function() {
println!("called `my::nested::function()`");
}
#[allow(dead_code)]
fn private_function() {
println!("called `my::nested::private_function()`");
}
}
// 嵌套项的可见性遵循相同的规则。
mod private_nested {
#[allow(dead_code)]
pub fn function() {
println!("called `my::private_nested::function()`");
}
}
}
fn function() {
println!("called `function()`");
}
fn main() {
// 模块允许在拥有相同名字的项之间消除歧义。
function();
my::function();
// 公有项,包括内部嵌套的公有项,可以在父级的模块中访问到。
my::indirect_access();
my::nested::function();
// 一个模块中的私有项不能被直接访问,即使私有项嵌套在公有的模块中:
// 报错!`private_function` 是私有的。
//my::private_function();
// 试一试 ^ 将此行注释去掉
// 报错! `private_function` 是私有的。
//my::nested::private_function();
// 试一试 ^ 将此行注释去掉
// 报错! `private_nested` 是私有的模块。
//my::private_nested::function();
// 试一试 ^ 将此行注释去掉
}