Rust模块解析疑问:b.rs中use crate::Summary为何可行?
问题描述
src目录下包含三个文件:main.rs、a.rs、b.rs,代码内容如下:
main.rs
mod a; mod b; use crate::a::Summary; use crate::b::Person; fn main() { let p = Person{ first: "John".to_string(), last: "Doe".to_string() }; sum(p); } fn sum(summary: impl Summary) { println!("{}", summary.summarize()); }
a.rs
pub trait Summary { fn summarize(&self) -> String; }
b.rs
use crate::Summary; pub struct Person { pub first: String, pub last: String, } impl Summary for Person { fn summarize(&self) -> String { format!("{}, {}.", self.last, self.first) } }
疑问:b.rs中的use crate::Summary;为何没有引发错误?按照逻辑应该写成use crate::a::Summary;或者use super::a::Summary;,但该语句却能正常工作,是否存在特殊的底层搜索逻辑?
解答
按照你给出的代码,use crate::Summary;实际上会触发编译错误——Summary trait定义在crate::a子模块中,根模块(main.rs)并没有将它暴露到自身的公共命名空间,编译器会提示no Summary in the root module。
如果你的代码确实能正常编译运行,大概率是你在main.rs中额外添加了**重导出(re-export)**代码:
mod a; mod b; // 这行将a模块的Summary重导出到根模块的公共命名空间 pub use a::Summary; use crate::a::Summary; use crate::b::Person; // ... 其余代码不变
用pub use a::Summary;时,相当于把a模块里的Summary“映射”到了根模块下,此时crate::Summary就等价于crate::a::Summary,b.rs的导入语句自然能正常工作。
此外还有两种小概率可能:
- 你误将
a.rs的内容直接写在了main.rs中,此时Summary本身就位于根模块; - 你的项目是库项目(存在
lib.rs),且lib.rs中做了pub use a::Summary;的重导出,main.rs依赖了该库 crate。
内容的提问来源于stack exchange,提问作者John Caruso
相关产品推荐
相关产品推荐

