• 可见性

    可见性

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