可见性

默认情况下,模块中的项拥有私有的可见性(private visibility),不过可以加上 pub 修饰语来重载这一行为。模块中只有公有的(public)项可以从模块外的作用域 访问。

``rust,editable // 一个名为my_mod的模块 mod my_mod { // 模块中的项默认具有私有的可见性 fn private_function() { println!("calledmy_mod::private_function()`”); }

  1. // 使用 `pub` 修饰语来改变默认可见性。
  2. pub fn function() {
  3. println!("called `my_mod::function()`");
  4. }
  5. // 在同一模块中,项可以访问其它项,即使它是私有的。
  6. pub fn indirect_access() {
  7. print!("called `my_mod::indirect_access()`, that\n> ");
  8. private_function();
  9. }
  10. // 模块也可以嵌套
  11. pub mod nested {
  12. pub fn function() {
  13. println!("called `my_mod::nested::function()`");
  14. }
  15. #[allow(dead_code)]
  16. fn private_function() {
  17. println!("called `my_mod::nested::private_function()`");
  18. }
  19. // 使用 `pub(in path)` 语法定义的函数只在给定的路径中可见。
  20. // `path` 必须是父模块(parent module)或祖先模块(ancestor module)
  21. pub(in my_mod) fn public_function_in_my_mod() {
  22. print!("called `my_mod::nested::public_function_in_my_mod()`, that\n > ");
  23. public_function_in_nested()
  24. }
  25. // 使用 `pub(self)` 语法定义的函数则只在当前模块中可见。
  26. pub(self) fn public_function_in_nested() {
  27. println!("called `my_mod::nested::public_function_in_nested");
  28. }
  29. // 使用 `pub(super)` 语法定义的函数只在父模块中可见。
  30. pub(super) fn public_function_in_super_mod() {
  31. println!("called my_mod::nested::public_function_in_super_mod");
  32. }
  33. }
  34. pub fn call_public_function_in_my_mod() {
  35. print!("called `my_mod::call_public_funcion_in_my_mod()`, that\n> ");
  36. nested::public_function_in_my_mod();
  37. print!("> ");
  38. nested::public_function_in_super_mod();
  39. }
  40. // `pub(crate)` 使得函数只在当前 crate 中可见
  41. pub(crate) fn public_function_in_crate() {
  42. println!("called `my_mod::public_function_in_crate()");
  43. }
  44. // 嵌套模块的可见性遵循相同的规则
  45. mod private_nested {
  46. #[allow(dead_code)]
  47. pub fn function() {
  48. println!("called `my_mod::private_nested::function()`");
  49. }
  50. }

}

fn function() { println!(“called function()“); }

fn main() { // 模块机制消除了相同名字的项之间的歧义。 function(); my_mod::function();

  1. // 公有项,包括嵌套模块内的,都可以在父模块外部访问。
  2. my_mod::indirect_access();
  3. my_mod::nested::function();
  4. my_mod::call_public_function_in_my_mod();
  5. // pub(crate) 项可以在同一个 crate 中的任何地方访问
  6. my_mod::public_function_in_crate();
  7. // pub(in path) 项只能在指定的模块中访问
  8. // 报错!函数 `public_function_in_my_mod` 是私有的
  9. //my_mod::nested::public_function_in_my_mod();
  10. // 试一试 ^ 取消该行的注释
  11. // 模块的私有项不能直接访问,即便它是嵌套在公有模块内部的
  12. // 报错!`private_function` 是私有的
  13. //my_mod::private_function();
  14. // 试一试 ^ 取消此行注释
  15. // 报错!`private_function` 是私有的
  16. //my_mod::nested::private_function();
  17. // 试一试 ^ 取消此行的注释
  18. // Error! `private_nested` is a private module
  19. //my_mod::private_nested::function();
  20. // 试一试 ^ 取消此行的注释

}