模块系统(the module system)
- 包(Packages): Cargo 的一个功能,它允许你构建、测试和分享 crate。
- Crates :一个模块的树形结构,它形成了库或二进制项目。
- 模块(Modules)和 use: 允许你控制作用域和路径的私有性。
- 路径(path):一个命名例如结构体、函数或模块等项的方式
包和 crate
crate 是一个二进制项或者库
包是提供一系列功能的一个或者多个crate,一个包会包含一个Cargo.toml文件,阐述如何去构建这些crate
包中包含的内容规则:
- 一个包中至多 只能 包含一个库 crate(library crate);
- 包中可以包含任意多个二进制 crate(binary crate);
- 包中至少包含一个 crate,无论是库的还是 二进制的。
约定:src/main.rs 就是一个与包同名的二进制 crate 的 crate 根
如果包目录中包含 src/lib.rs,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根
Cargo将crate根传递给rustc来实际构建库或者二进制项目
几种情况:
- 只包含
src/lib.rs
- 只包含
src/main.rs
- 同时包含
src/main.rs
和src/lib.rs
- 源文件写在
src/bin
目录下,可以有多个二进制crate,生成
定义模块来控制作用域与私有性
内容:
- 项的路径
- use
- pub
- as
- 外部包
- glob运算符
模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性
模块树 (module tree)
crate └── front_of_house
├── hosting
│ ├── add_to_waitlist
│ └── seat_at_table
└── serving
├── take_order
├── serve_order
└── take_payment
路径用于引用模块树中的项
- 绝对路径(absolute path)从 crate 根开始,以 crate 名或者字面值 crate 开头。
- 相对路径(relative path)从当前模块开始,以 self 、 super 或当前模块的标识符开 头。
使用 super 起始的相对路径
rust
fn serve_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::serve_order();
}
fn cook_order() {}
}
fn main() {}
使用 use 关键字将名称引入作用域
使用 as 关键字提供新的名称
rust
use std::fmt::Result;
use std::io::Result as IoResult;
fn function1() -> Result {
// --snip--
Ok(())
}
fn function2() -> IoResult<()> {
// --snip--
Ok(())
}
使用 pub use 重导出名称
使用外部包
嵌套路径来消除大量的 use 行
rust
use std::io::{self, Write};
通过 glob 运算符将所有的公有定义引入作用域
rust
use std::collections::*;
将模块分割进不同文件
rust
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
在 mod front_of_house 后使用分号,而不是代码块,这将告诉 Rust 在另一个与模块同名的 文件中加载模块的内容
src/front_of_house.rs
rust
pub mod hosting {
pub fn add_to_waitlist() {}
}
重构:保持模块树
src/front_of_house.rs
rust
pub mod hosting;
src/front_of_house/hosting.rs
rust
pub fn add_to_waitlist() {}