Rust如何导入存放在子文件夹中的公开module模块
Rust子文件夹模块导入解决方案(适用Rust 2018/2021版本)
首先明确Rust模块的基础规则:所有模块都需要先在父级模块中声明才能使用,在根模块(main.rs/lib.rs)声明mod cpu;时,Rust默认会查找两个路径:
- 同级目录下的
cpu.rs文件 - 同级目录下
cpu/文件夹内的mod.rs文件
你当前的文件结构不符合默认查找规则,因此可以选择以下任意一种方案解决:
方案1:调整为标准目录模块结构(推荐)
该方案符合Rust官方约定,适合长期维护的项目:
- 第一步:将
src/cpu/cpu.rs的所有内容移动到新建的src/cpu/mod.rs文件中,删除原有的src/cpu/cpu.rs,调整后的文件结构如下:
src/ ├── main.rs └── cpu/ └── mod.rs
- 第二步:在
src/main.rs顶部添加模块声明和导入代码:
mod cpu; use cpu::{Cpu, thing}; fn main() { println!("Hello, world!"); let c : Cpu; thing(); }
如果后续cpu模块需要拆分更多子文件,直接在cpu/目录下新增文件,在mod.rs中导出对应内容即可。
方案2:不修改现有文件结构,手动指定模块路径
适合临时调整、不想改动文件结构的场景,要求Rust版本≥1.60:
- 直接在
src/main.rs顶部通过#[path]属性指定cpu模块的文件路径:
#[path = "cpu/cpu.rs"] mod cpu; use cpu::{Cpu, thing}; fn main() { println!("Hello, world!"); let c : Cpu; thing(); }
注意#[path]后的路径是相对于当前main.rs文件的相对路径。
报错原因说明
之前使用use crate::cpu::{Cpu, thing};报错是因为你没有在根模块声明cpu模块,Rust不会自动识别文件夹下的文件为模块,必须显式声明后才能导入使用。
内容的提问来源于stack exchange,提问作者Lightsong
相关产品推荐
相关产品推荐

