Rust跨.rs文件引用模块报错,如何正确实现文件间代码引用?
搞定Rust模块引用问题:别把
mod和导入搞混啦 这个问题我之前也踩过坑!核心是没搞清楚Rust里mod关键字的真实作用,咱们一步步理清楚:
为什么会报“找不到模块b”的错?
你在b.rs里写的mod a;,Rust编译器会理解成你要给b模块声明一个子模块a,所以它会去src/b/a.rs或者src/b/a/mod.rs找文件——这完全不是你想要的引用根目录a.rs的效果!
mod xxx;的作用是定义子模块,而不是“导入”已存在的同级模块,这是新手最容易混淆的点。
正确引用其他文件的模块方式
要在b.rs里访问根目录的a模块,有几种简单的方法:
1. 用绝对路径(最推荐,清晰无歧义)
直接从crate根目录出发,用crate::前缀引用:
// b.rs // 删掉错误的 mod a; ,换成导入根目录的a use crate::a; struct That { mything: &a::MyThing, // 注意这里是逗号,不是分号!你原来的代码多了分号 }
2. 用相对路径
因为a和b都是crate根的直接子模块,你可以用super::引用父模块(也就是根目录)下的a:
// b.rs use super::a; struct That { mything: &a::MyThing, }
3. 直接写全路径(不用导入)
如果不想写use语句,也可以直接在类型里写完整路径:
// b.rs struct That { mything: &crate::a::MyThing, }
最后修正你的完整代码
还有两个小细节要改:
main.rs里的字段名写错了:myThing应该是mything(和b.rs里的结构体字段名一致,Rust大小写敏感)b.rs里结构体字段结尾是逗号,不是分号
修正后的代码如下:
// a.rs struct MyThing { }
// b.rs use crate::a; struct That { mything: &a::MyThing, }
// main.rs mod a; mod b; fn main() { let thing = a::MyThing{}; let that = b::That{mything: &thing}; }
确保你的文件结构是这样的:
src/ ├── main.rs ├── a.rs └── b.rs
现在编译应该就没问题啦!
内容的提问来源于stack exchange,提问作者lmat - Reinstate Monica
相关产品推荐
相关产品推荐

