rust项目中的lib.rs 和 mod.rs 有什么作用和区别?
nbstudy 发表于 2025-05-28 13:43:31
在 Rust 的 Cargo 项目中,lib.rs
和 mod.rs
(或 mod/
目录结构)用于组织模块系统。
它们的作用和区别如下:
1. lib.rs
的作用
lib.rs
是 Rust 库项目的入口文件,用于定义库的公共 API。当你执行 cargo new --lib mylibrary
时,Cargo 会自动生成这个文件。
关键特点
- 库的根模块:所有子模块都相对于
lib.rs
进行组织。 - 公共 API 的定义:通过
pub
关键字暴露模块、函数或类型。 - 无需显式声明:Cargo 会自动将
src/lib.rs
作为库的入口。
示例
假设项目结构如下:
mylibrary/
├── Cargo.toml
└── src/
└── lib.rs
lib.rs
内容:
rust
// 定义公共模块
pub mod utils; // 对应 src/utils.rs 或 src/utils/mod.rs
// 定义公共函数
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
// 私有模块(外部不可见)
mod internal {
pub fn secret_function() -> &'static str {
"This is internal!"
}
}
2. mod.rs
的作用
mod.rs
用于定义子模块的内容。它可以是一个单独的文件(如 src/module_name/mod.rs
),也可以简化为 src/module_name.rs
。
关键特点
- 子模块的入口:当模块包含多个文件时,使用
mod.rs
组织它们。 - 模块嵌套:可以通过
mod.rs
创建多级模块结构。 - 现代替代方案:Rust 2018 之后,推荐使用
module_name.rs
替代module_name/mod.rs
(见下文示例)。
示例 1:传统 mod.rs
结构
mylibrary/
├── Cargo.toml
└── src/
├── lib.rs
└── utils/
├── mod.rs # 子模块入口
└── math.rs # 子模块中的文件
src/utils/mod.rs
内容:
rust
// 引入同级文件作为子模块
pub mod math; // 对应 src/utils/math.rs
// 定义模块内的公共函数
pub fn say_hello() {
println!("Hello from utils!");
}
src/utils/math.rs
内容:
rust
// 子模块中的公共函数
pub fn multiply(a: i32, b: i32) -> i32 {
a * b
}
示例 2:简化的模块结构(Rust 2018+)
Rust 2018 之后,可以直接用 module_name.rs
替代 module_name/mod.rs
,减少嵌套层级。
mylibrary/
├── Cargo.toml
└── src/
├── lib.rs
├── utils.rs # 替代 utils/mod.rs
└── utils/
└── math.rs # 子模块文件
src/utils.rs
内容:
rust
// 引入子目录中的文件
pub mod math; // 对应 src/utils/math.rs
pub fn say_hello() {
println!("Hello from utils!");
}
3. 主要区别
对比项 | lib.rs |
mod.rs / module.rs |
---|---|---|
角色 | 库的根入口 | 子模块的入口 |
必需性 | 库项目必须存在 | 非必需,按需创建 |
文件名 | 固定为 lib.rs |
可以是 mod.rs 或 module_name.rs |
路径映射 | 对应 crate 根(如 mylibrary:: ) |
对应模块路径(如 mylibrary::utils ) |
使用场景 | 定义公共 API、引入子模块 | 组织子模块的内部结构 |
4. 最佳实践
- 小型模块:直接使用
module_name.rs
(如src/utils.rs
)。 - 大型模块:使用
module_name/mod.rs
+ 子文件(如src/utils/mod.rs
)。 - 公共 API:在
lib.rs
中通过pub use
重导出模块内容,简化外部调用。
rust
// lib.rs 中重导出
pub use utils::math::multiply; // 使 mylibrary::multiply 可用
总结
lib.rs
:是库项目的核心入口,负责定义公共 API 和组织顶级模块。mod.rs
/module_name.rs
:用于组织子模块的内部结构,避免单个文件过大。
合理使用这两个文件,可以让 Rust 项目的模块结构清晰且易于维护。