如何在Rust中加载同级模块文件?以models模块为例
Rust模块间类型引用问题解决
问题场景
我有一个名为models的模块,目录结构包含mod.rs、distribution.rs、item.rs、project.rs、relation.rs。在models/mod.rs中做了重导出:
mod distribution; mod item; mod project; mod relation; pub use distribution::Distribution; pub use item::Item; pub use project::Project; pub use relation::Relation;
在main.rs中使用这些类型完全正常:
mod models; use models::Item; use models::Project; use models::Relation; use models::Distribution;
但在models/item.rs中尝试引用Distribution类型时,以下两种写法均报错:
// 写法一:报错 mod models; use models::Distribution;
// 写法二:报错 mod distribution; use distribution::Distribution;
解决方法
方法一:利用上层模块的重导出(推荐)
因为models/mod.rs已经将Distribution重导出为公共类型,在item.rs中可以通过相对路径引用上层模块:
use super::Distribution;
这里的super指向item.rs的父模块(即models模块,对应mod.rs),直接复用已有的重导出即可。
方法二:通过crate根路径直接引用
从crate的根目录出发,明确指定Distribution的完整路径:
use crate::models::Distribution;
或者直接引用distribution模块的类型:
use crate::models::distribution::Distribution;
方法三:将子模块设为公共模块(可选)
如果需要直接在同级模块间引用子模块,可以在models/mod.rs中将distribution声明为pub mod:
pub mod distribution; // 修改为pub mod mod item; mod project; mod relation; pub use distribution::Distribution; // ... 其他重导出保持不变
之后在item.rs中就可以直接引用同级的公共模块:
use super::distribution::Distribution;
错误原因说明
- 写法一中的
mod models;是错误的:item.rs本身属于models模块,不能在子模块内再次声明父模块。 - 写法二中的
mod distribution;会尝试将distribution作为item的子模块加载,但实际distribution是和item同级的模块,并非item的子模块,因此编译器找不到对应的文件。
内容的提问来源于stack exchange,提问作者Yuri Gor
相关产品推荐
相关产品推荐

