Rust如何正确引用同模块其他文件内容?有C/C++/Python基础求教
Rust 模块引用问题解答
核心误区澄清
首先要明确 Rust 中 mod 和 use 的完全不同的作用,很多有 C/C++/Python 背景的开发者很容易搞混这两个关键字的定位:
mod是模块声明关键字,作用是告诉编译器「这个模块存在,需要把对应文件的代码纳入编译流程」,同一个模块全局只能声明一次。你已经在stuff.rs中写了pub mod a;pub mod b;pub mod c;,就已经把三个子模块全部注册到stuff父模块下了,不需要在其他地方重复声明。use是导入关键字,作用是把已经声明过的模块/类型引入当前作用域,和 Python 的import作用类似,和 C/C++ 的#include完全不是同一个逻辑(#include是纯文本拷贝,没有模块约束)。
你当前的目录结构完全符合 Rust 最新规范,用 stuff.rs 代替旧版的 mod.rs 的写法是正确的,stuff.rs 本质上就等价于 Python 包的 __init__.py,用来声明子模块、导出公共内容。
错误写法的原因说明
你之前尝试的几种错误写法本质都是重复声明模块、或者模块路径匹配错误:
- 写
mod stuff;报错:b.rs本身已经是stuff模块的子模块,在b.rs里声明mod stuff会默认找b子目录下的stuff.rs/stuff/mod.rs,路径不存在自然报错。 - 直接写
mod a;报错:默认会找b子目录下的a.rs,路径不存在自然报错。 - 加
#[path = "a.rs"]的mod a;虽然能运行,但属于错误用法:相当于重复声明了a模块,会把a.rs的代码编译两次,后续会出现「两个同名结构体被判定为不同类型」的奇怪问题,生产项目禁止这么写。
正确实现方式
同一父模块下的兄弟模块互相引用,不需要写全绝对路径,直接用 super 关键字表示当前模块的父模块即可,写法非常简单:
// b.rs 中直接写这个就行,不需要其他mod声明 use super::a::StructA; // 你的业务代码 pub struct StructB; impl StructB { pub fn new(a: StructA) -> Self { Self } }
如果你的模块层级更深、不想写多级 super,也可以用绝对路径 use crate::stuff::a::StructA;,两种写法都是合法的,可以根据场景选择。
内容的提问来源于stack exchange,提问作者weyh
相关产品推荐
相关产品推荐

