Rust中模块声明前的pub关键字有何作用?模块可见性是否冗余?
Rust模块前
pub关键字的作用及可见性冗余问题解析 一、模块前pub的核心作用
Rust里模块默认是私有(private)的,只有当前模块和它的子模块能找到并访问它。给模块加pub,本质是把这个模块的“访问入口”打开:
- 如果是 crate 内部的模块,
pub模块能被所有父模块、祖先模块,以及整个 crate 里的其他模块通过路径引用; - 如果是库 crate 里的
pub模块,外部 crate 可以用use导入这个模块,进而访问模块内开放的成员。
举个直观的例子:
// 不带pub的私有模块,只能在当前文件里用 mod private_mod { pub fn print_msg() { println!("我是私有模块里的公共函数"); } } // 带pub的公共模块,整个crate都能访问 pub mod pub_mod { pub fn print_another() { println!("我是公共模块里的公共函数"); } } fn main() { // 当前文件内可以调用私有模块的公共函数 private_mod::print_msg(); // 也能调用公共模块的函数 pub_mod::print_another(); }
二、模块可见性绝对不冗余
你疑惑模块的pub好像冗余,其实是没分清模块的可见性和成员的可见性是两层完全不同的控制:
- 模块的
pub:决定外部代码能不能“找到这个模块的路径”; - 成员的
pub:决定找到模块路径后,能不能调用这个成员。
1. 模块私有,哪怕成员是pub也白搭
如果模块没加pub,外部代码连这个模块的存在都看不到,就算里面的函数标了pub也调用不了:
mod hidden_mod { pub fn secret_func() {} } // 在另一个文件或模块里 // 编译直接报错:找不到`hidden_mod`,因为它是私有的 // hidden_mod::secret_func();
2. 模块pub但成员私有,看得见摸不着
模块加了pub,外部能看到这个模块,但里面没加pub的成员还是碰不到:
pub mod visible_mod { fn inner_func() {} } fn main() { // 编译报错:`inner_func`是私有的,无法访问 // visible_mod::inner_func(); }
3. 双pub配合才是完整的对外暴露
只有模块pub + 成员pub,外部才能真正访问到成员。这其实是Rust“最小权限原则”的体现:你可以先开放模块的访问入口,再精细控制内部哪些功能对外可见,把实现细节藏起来。
比如写库的时候:
// 库的lib.rs pub mod api { pub fn create_user() {} // 对外暴露的API fn validate_input() {} // 内部辅助函数,不对外 } mod internal_utils { pub fn db_query() {} // 仅内部使用的工具,外部看不到 }
外部 crate 只能use my_lib::api;然后调用api::create_user(),完全看不到internal_utils模块,也碰不到api里的validate_input,完美做到了接口和实现分离。
总结
模块的pub管的是“能不能找到这个模块”,成员的pub管的是“能不能用模块里的东西”,二者是分层控制的,缺一不可,完全不存在冗余。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

