可见性

当你开始将代码分解成多个模块时,就需要开始考虑可见性的问题了。可见性决定了你的代码(或其他人的代码)中哪些部分能够访问给定的实体,不论是结构体、函数、字段等。

默认私有

Rust中,默认一切都是私有的
私有实体只能在以下情况下被访问:

  1. 定义它的同一个模块内部,或
  2. 其子模块之一

在之前的练习中,我们广泛使用了这一点:

  • create_todo_ticket 工作正常(一旦你添加了use语句),因为helpers是crate根模块的子模块,而Ticket在那里被定义。因此,create_todo_ticket可以无障碍地访问Ticket,即便Ticket是私有的。
  • 所有单元测试都定义在其测试代码的子模块中,因此可以不受限制地访问一切。

可见性修饰符

你可以使用可见性修饰符来修改实体的默认可见性。一些常见的可见性修饰符包括:

  • pub:使实体公开,即在定义它的模块之外也能访问,可能还允许其他crate访问。
  • pub(crate):在同一个crate内部公开实体,但不允许外部访问。
  • pub(super):在父模块中公开实体。
  • pub(in path::to::module):在指定的模块中公开实体。

你可以在模块、结构体、函数、字段等上使用这些修饰符。 例如:

#![allow(unused)]
fn main() {
pub struct Configuration {
    pub(crate) version: u32,
    active: bool,
}
}

Configuration是公开的,但你只能在同一crate内访问version字段。 相反,active字段是私有的,只能在同一个模块或其子模块内部访问。

参考资料

  • 本节练习位于 exercises/03_ticket_v1/04_visibility