可见性

项(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. }

8. // 使用 `pub` 修饰语来改变默认可见性。
9. pub fn function() {
10. println!("called `my::function()`");
11. }

13. // 在同一模块中,项可以访问其它项,即使是私有属性。
14. pub fn indirect_access() {
15. print!("called `my::indirect_access()`, that\n> ");
16. private_function();
17. }

19. // 项也可以嵌套。
20. pub mod nested {
21. pub fn function() {
22. println!("called `my::nested::function()`");
23. }

25. #[allow(dead_code)]
26. fn private_function() {
27. println!("called `my::nested::private_function()`");
28. }
29. }

31. // 嵌套项的可见性遵循相同的规则。
32. mod private_nested {
33. #[allow(dead_code)]
34. pub fn function() {
35. println!("called `my::private_nested::function()`");
36. }
37. }
38. }

40. fn function() {
41. println!("called `function()`");
42. }

44. fn main() {
45. // 模块允许在拥有相同名字的项之间消除歧义。
46. function();
47. my::function();

49. // 公有项,包括内部嵌套的公有项,可以在父级的模块中访问到。
50. my::indirect_access();
51. my::nested::function();

53. // 一个模块中的私有项不能被直接访问,即使私有项嵌套在公有的模块中:

55. // 报错!`private_function` 是私有的。
56. //my::private_function();
57. // 试一试 ^ 将此行注释去掉

59. // 报错! `private_function` 是私有的。
60. //my::nested::private_function();
61. // 试一试 ^ 将此行注释去掉

63. // 报错! `private_nested` 是私有的模块。
64. //my::private_nested::function();
65. // 试一试 ^ 将此行注释去掉

67. }