Rust 模块的用法
【摘要】 在 Rust 中,模块(mod) 是组织代码的核心机制,用于管理作用域、隐私性和代码结构。以下是关于 Rust 模块系统的详细说明: 1. 模块基础 定义模块使用 mod 关键字声明模块,模块可以嵌套:// src/lib.rs 或 src/main.rsmod my_module { fn private_function() { println!("这是私有函数");...
在 Rust 中,模块(mod
) 是组织代码的核心机制,用于管理作用域、隐私性和代码结构。以下是关于 Rust 模块系统的详细说明:
1. 模块基础
定义模块
使用 mod
关键字声明模块,模块可以嵌套:
// src/lib.rs 或 src/main.rs
mod my_module {
fn private_function() {
println!("这是私有函数");
}
pub fn public_function() {
println!("这是公开函数");
}
mod nested_module {
pub fn nested_function() {
println!("嵌套模块中的函数");
}
}
}
访问模块内容
- 同一文件内:直接通过模块路径访问。
- 子模块:默认私有,需用
pub
暴露。 - 父模块:子模块可以访问父模块的私有项(Rust 的特殊规则)。
fn main() {
my_module::public_function(); // 正确
// my_module::private_function(); // 错误:私有函数
// my_module::nested_module::nested_function(); // 错误:嵌套模块未公开
}
2. 模块文件结构
Rust 默认从以下文件加载模块:
- 单文件模块:直接在
src/lib.rs
或src/main.rs
中定义。 - 多文件模块:
- 声明模块:
mod my_module;
(无{}
)。 - 文件位置:
my_module.rs
(同级目录)。my_module/mod.rs
(旧版风格,Rust 2018 后不推荐)。
- 声明模块:
示例:多文件模块
src/
├── lib.rs
└── my_module/
├── mod.rs // 模块根
└── nested.rs // 子模块
src/lib.rs
:
mod my_module; // 声明模块(自动查找 my_module/mod.rs)
src/my_module/mod.rs
:
pub mod nested; // 声明子模块(自动查找 nested.rs)
pub fn public_function() {
println!("my_module::public_function");
}
src/my_module/nested.rs
:
pub fn nested_function() {
println!("nested_module::nested_function");
}
使用方式:
use my_module::nested::nested_function;
fn main() {
my_module::public_function();
nested_function();
}
3. 路径与可见性
路径规则
- 绝对路径:从 crate 根开始(
crate::my_module
)。 - 相对路径:从当前模块开始(
super::
或self::
)。
mod my_module {
pub fn public_func() {
println!("public_func");
}
}
fn main() {
// 绝对路径
crate::my_module::public_func();
// 相对路径(假设在另一个模块中)
// super::my_module::public_func();
}
可见性控制
pub
:公开项(对外部可见)。- 默认私有:仅在当前模块或子模块中可用。
- 特殊规则:子模块可以访问父模块的私有项(反之不行)。
4. use
关键字
用于简化路径:
use my_module::public_function;
// 或重命名
use my_module::public_function as my_func;
fn main() {
public_function(); // 直接调用
my_func(); // 使用别名
}
常见用法
- 引入多个项:
use std::{collections::HashMap, fmt::Result};
- 引入所有公开项(慎用):
use std::collections::*;
5. 模块与 super
和 self
self
:当前模块(类似this
)。super
:父模块(类似../
)。
mod parent {
pub mod child {
pub fn function() {
println!("child::function");
}
}
pub fn call_child() {
self::child::function(); // 等价于 child::function()
super::main(); // 访问根模块的 main(需在子模块中)
}
}
6. 模块与工作空间
在大型项目中,模块可以跨文件甚至跨 crate 组织:
- 同一 crate:通过
mod
和文件结构管理。 - 外部 crate:在
Cargo.toml
中声明依赖,用extern crate
(Rust 2018 后通常省略)。
总结
概念 | 说明 |
---|---|
mod |
定义模块,支持嵌套 |
pub |
控制可见性 |
use |
简化路径 |
super /self |
相对路径导航 |
文件结构 | mod.rs 或 name.rs 组织多文件模块 |
最佳实践
- 按功能划分模块(如
mod network; mod parser;
)。 - 避免过度嵌套(通常不超过 3 层)。
- 使用
pub use
重新导出常用项(简化用户路径)。
通过模块系统,Rust 可以高效管理代码规模,同时保持严格的访问控制。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)