可见性

项(item)默认情况下拥有私有的可见性(private visibility),不过可以加上 pub (public 的前 3 个字母)修饰语(modifier)来改变默认行为。一个模块之外的作用域只能访问该模块里面的公有项(public item)。

  1. // 一个名为 `my` 的模块
  2. mod my {
  3. // 在模块中的项默认带有私有可见性。
  4. fn private_function() {
  5. println!("called `my::private_function()`");
  6. }
  7. // 使用 `pub` 修饰语来改变默认可见性。
  8. pub fn function() {
  9. println!("called `my::function()`");
  10. }
  11. // 在同一模块中,项可以访问其它项,即使是私有属性。
  12. pub fn indirect_access() {
  13. print!("called `my::indirect_access()`, that\n> ");
  14. private_function();
  15. }
  16. // 项也可以嵌套。
  17. pub mod nested {
  18. pub fn function() {
  19. println!("called `my::nested::function()`");
  20. }
  21. #[allow(dead_code)]
  22. fn private_function() {
  23. println!("called `my::nested::private_function()`");
  24. }
  25. }
  26. // 嵌套项的可见性遵循相同的规则。
  27. mod private_nested {
  28. #[allow(dead_code)]
  29. pub fn function() {
  30. println!("called `my::private_nested::function()`");
  31. }
  32. }
  33. }
  34. fn function() {
  35. println!("called `function()`");
  36. }
  37. fn main() {
  38. // 模块允许在拥有相同名字的项之间消除歧义。
  39. function();
  40. my::function();
  41. // 公有项,包括内部嵌套的公有项,可以在父级的模块中访问到。
  42. my::indirect_access();
  43. my::nested::function();
  44. // 一个模块中的私有项不能被直接访问,即使私有项嵌套在公有的模块中:
  45. // 报错!`private_function` 是私有的。
  46. //my::private_function();
  47. // 试一试 ^ 将此行注释去掉
  48. // 报错! `private_function` 是私有的。
  49. //my::nested::private_function();
  50. // 试一试 ^ 将此行注释去掉
  51. // 报错! `private_nested` 是私有的模块。
  52. //my::private_nested::function();
  53. // 试一试 ^ 将此行注释去掉
  54. }