Rust未加pub的顶层模块可直接访问的原因及规则咨询
Rust模块可见性规则:顶层模块与内部子模块的差异
为什么第一个例子没有报错?
你第一个代码示例里编译器未提示错误,核心原因是:同一文件内声明的顶层模块,默认对该文件内的所有代码可见,不需要给模块本身添加pub关键字。
结合代码示例分析
示例1:合法访问顶层模块
fn main() { Test::test(); // 正常工作:Test是同一文件的顶层模块,当前文件内可直接访问 } mod Test { pub fn test() { println!("Hello World"); } }
这里Test是直接在当前文件中声明的顶层模块,属于当前crate根模块的子模块。同一文件内的代码(比如main函数)和该模块处于同一可见性上下文,因此可以直接引用Test的名称。而test函数加了pub,所以能被外部调用。
示例2:无法访问私有内部子模块
fn main() { Test::inner::test(); // 编译错误:inner是Test的私有子模块,外部无法访问 } mod Test { mod inner { // 默认私有,仅Test内部可见 pub fn test() { println!("Hello World"); } } }
这里inner是Test内部的子模块,Rust中模块内部的项(子模块、函数、结构体等)默认是私有的——只有父模块(Test)及其内部代码能访问它。外部代码(比如main)要访问inner,必须给inner加上pub关键字。
具体规则总结
- 同一文件内的顶层模块:默认对该文件内的所有代码可见,无需添加
pub。 - 模块内部的项:子模块、函数、结构体等默认私有,仅能被当前模块及其子模块访问;若要让外部访问,必须给该项添加
pub。 - 跨文件模块:如果在其他文件中声明模块,需要在当前文件通过
mod引入;若要让其他文件访问该模块,需在声明它的文件中使用pub mod。
内容的提问来源于stack exchange,提问作者ng.newbie
相关产品推荐
相关产品推荐

