Rust中use与pub use关键字的作用及区别是什么?
移除use仍可正常运行的原因
你遇到的这个现象分两种情况:
- 如果你移除的是示例代码里的
pub use crate::front_of_house::hosting;:eat_at_restaurant本身是带pub修饰的公开函数,它的可见性和你是否导出hosting模块完全无关。只要你把函数内部的hosting::add_to_waitlist()替换为完整路径crate::front_of_house::hosting::add_to_waitlist(),函数逻辑不会有任何变化,调用结果自然相同。 - 如果你移除的是main文件里的
use tests::eat_at_restaurant;:use本质只是把对应路径的项引入当前作用域的语法糖,不是调用的必要条件。移除后只要把main里的调用改成完整路径tests::eat_at_restaurant(),一样可以正常运行。
无法在main中直接调用hosting::add_to_waitlist的原因
核心是你没有把hosting导入到main的作用域,也没有写完整路径:
你在tests模块里写的pub use是把hosting重导出为tests模块的公开API,也就是说hosting对外的公开路径是tests::hosting,不是根路径下直接的hosting。你在main里要直接用hosting的话,需要先加use tests::hosting;导入,或者调用时写完整路径tests::hosting::add_to_waitlist()。
use前加pub和不加的区别
两者的核心差异是导入的项是否对外暴露:
- 不加
pub的普通use:属于模块私有导入,导入的项只能在当前模块内部使用,外部模块无法通过当前模块的路径访问到你导入的内容 - 加了
pub的use:属于公开重导出(re-export),导入的项会成为当前模块公开API的一部分,外部模块可以直接通过当前模块的路径访问到被导入的内容。你示例里的写法就是典型的重导出场景,相当于把原本藏在front_of_house内部的hosting模块,提升到tests模块的顶层对外暴露,不用让用户感知到front_of_house这个内部层级。
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

