Rust同目录跨文件调用函数方法?是否必须在main.rs声明所有mod?
Rust同级rs文件互相调用及mod声明问题解答
错误原因
你遇到的编译错误本质是对Rust mod 关键字的作用理解有误:
mod xxx; 不是导入语句,而是模块声明挂载语句,你写这个声明的位置直接决定了xxx模块的父级:
你在a.rs中写mod b;时,Rust会默认b是a的子模块,所以会去a/b.rs或a/b/mod.rs路径下找文件,和你实际的目录结构不匹配,自然报错。
核心问题解答
不需要把所有mod xxx;都放在main.rs里,只要模块挂载路径和实际目录结构对应即可,同级rs文件互相调用有两种常用实现方案:
方案1:所有同级文件都挂载到根模块(适合小型项目)
main.rs作为二进制crate的根模块,所有同级rs文件都在根模块声明挂载,之后任意文件都可以通过crate::xxx路径引用其他同级模块的导出内容:
- main.rs中声明所有根级模块:
mod a; mod b; // 把b也挂载为根模块的子模块 use a::a; fn main() { println!("Hello, world!"); a(); }
- a.rs中不需要再声明mod b,直接通过根路径引用即可:
use crate::b::b; pub fn a() { b(); }
方案2:按功能分组挂载到子模块(适合中大型项目)
如果不想把所有mod声明都堆在main.rs,可以按功能把同组文件放到同一个文件夹下,通过文件夹对应的mod.rs统一管理子模块:
- 调整目录结构如下:
. ├── common │ ├── a.rs │ ├── b.rs │ └── mod.rs └── main.rs
- common/mod.rs中声明该文件夹下的所有子模块,按需导出公共内容:
mod a; mod b; // 导出a函数给外部调用 pub use a::a;
- a.rs中调用同级的b模块,使用super关键字引用父级模块下的内容即可:
use super::b::b; pub fn a() { b(); }
- main.rs只需要声明一次common模块即可调用内部导出的内容:
mod common; use common::a; fn main() { println!("Hello, world!"); a(); }
关键注意点
- 不要混淆
mod和use的作用:mod负责告诉编译器模块存在、挂载到模块树的哪个位置;use只负责把已挂载的模块/导出项引入当前作用域,简化调用路径。 - 同级.rs文件本质是同一父模块下的兄弟子模块,必须先挂载到同一个父模块,才能通过父模块路径互相引用。
内容的提问来源于stack exchange,提问作者hbprotoss
相关产品推荐
相关产品推荐

