可见性
当你开始将代码分解成多个模块时,就需要开始考虑可见性的问题了。可见性决定了你的代码(或其他人的代码)中哪些部分能够访问给定的实体,不论是结构体、函数、字段等。
默认私有
Rust中,默认一切都是私有的。
私有实体只能在以下情况下被访问:
- 定义它的同一个模块内部,或
- 其子模块之一
在之前的练习中,我们广泛使用了这一点:
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