可见性
项(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(); // 试一试 ^ 将此行注释去掉 }