文章
关于Rust中mod.rs用法
目录
从 Rust 2018 Edition 开始,使用与模块同名的文件夹 + 同名 .rs 文件的方式可以完全替代 ****mod.rs,这是官方推荐的新模块组织方式,称为“文件系统模块重构(File System Module Reorganization)”。#
✅ 模块同名的文件夹可以完全替代 mod.rs 的结构#
假设你有这样一个模块结构(旧的方式):
src/
├── main.rs
└── network/
├── mod.rs
├── client.rs
└── server.rs
可以重构为如下新结构:
src/
├── main.rs
├── network.rs // 取代原来的 network/mod.rs
└── network/
├── client.rs
└── server.rs
在 main.rs 中写:
mod network;
fn main() {
network::client::connect();
}
在 network.rs 中:
pub mod client;
pub mod server;
pub fn init() {
println!("Network initialized");
}
📌 规则对比(旧 vs 新)#
| 功能/行为 | Rust 2015 (`mod.rs`) | Rust 2018+(扁平化结构) |
| 模块入口文件 | `foo/mod.rs` | `foo.rs` |
| 子模块文件 | `foo/bar.rs`,在 `mod.rs` 中声明 `mod bar;` | 同样是 `foo/bar.rs`,但在 `foo.rs` 中声明 |
| 使用习惯 | 层级嵌套深 | 更扁平、更简洁 |
| 推荐度 | 已逐步弃用 | ✅ 推荐使用 |
✅ 推荐用法示例(无 mod.rs)#
src/
├── main.rs
├── auth.rs
└── auth/
├── jwt.rs
└── session.rs
在 auth.rs 中:
pub mod jwt;
pub mod session;
pub fn authenticate() {
println!("Authenticating...");
}
在 main.rs 中:
mod auth;
fn main() {
auth::authenticate();
auth::jwt::parse_token();
}
⚠️ 注意事项#
- 不要混用
mod.rs和 ****foo.rs:- 如果你使用
foo.rs,就不要在foo/目录中放mod.rs,否则可能导致重复定义错误。 - 选择其中一种风格保持一致。
- 如果你使用
- 文件名与目录结构必须对应:
mod foo;会查找foo.rs或foo/mod.rs,不能自己改名字。
- 工具支持:
- 如
rust-analyzer等工具对“扁平化结构”支持良好,提示和跳转更清晰。
- 如
✅ 结论#
- 是的,使用同名
.rs文件 + 同名目录(扁平结构)可以 100% 替代 ****mod.rs。 - 在 Rust 2018+ 项目中,推荐完全不用 ****
mod.rs,除非你维护的是旧代码或依赖旧工具链。 - 保持一致的模块结构风格,是维护大型项目的关键。
如果你正在写一个新项目,建议采用
foo.rs+foo/目录结构,避免使用 ****mod.rs。这样结构更清晰,模块层级更扁平,利于维护和重构。