You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:50:29