Package, Crate, Moudle

# 个人理解
- package → 一套解决方案
- crate → 项目 由这些项目组成了一套结局方案
- module → 模块 由这些模块组成了一个个的项目
# Package & Crate
- Package
- 包含一个Cargo.toml文件,描述了如何构建这些Crates
- 一个Package只能包含0-1个library crate
- 可以包含多个 binary crate
- 必须至少包含一个crate
- Crate类型
- binary 二进制crate
- library 库crate
- Crate Root
- 源代码文件
- Rust编译器从这里开始,组成你Crate的根Module,编译后在对顶层会有一个名为crate的隐式根module
crate
└── front_of_house
├── hosting
│ ├── add_to_waitlist
│ └── seat_at_table
└── serving
├── take_order
├── serve_order
└── take_payment
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Module
- 在一个 crate 中,对代码进行分组
- 增加可读性,易于复用
- 控制项目item的私有性。public private
- 模块中的内容默认为私有的,要想被外部调用需要使用
pub关键字 - 同级模块可以相互调用,不管是否为私有条目。父模块不能使用子模块的私有条目,子模块可以使用父模块的私有条目
# 建立module
mod关键字- 可嵌套
# Path
- 为了在Rust中找到某个条目,需要使用Path
- 路径的两种形式
- 绝对路径:从crate root开始,使用
crate名或者字面值crate - 相对路径:从当前模块开始,使用
super,self或者当前模块的标识符 - 路径至少有一个标识符组成 ,标识符之间使用连接
- 绝对路径:从crate root开始,使用
mod front_of_house {
fn cook_order() {}
pub mod hosting {
pub fn add_to_wait_list() {
// 相对路径调用父级模块条目
super::cook_order()
}
}
}
fn handle() {
// 绝对路径调用
crate::front_of_house::hosting::add_to_wait_list();
// 相对路径调用
self::front_of_house::hosting::add_to_wait_list();
// 当前模块标识符调用
front_of_house::hosting::add_to_wait_list();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# use关键字
- 可以使用
use关键字将路径导入到当前作用域内- 仍遵守私有原则
- 惯用做法:如果条目是函数,则指定到函数的父级模块。如果条目是
sturct或者enum则指定到条目本身。如果要引入两个同名的条目,则指定到父级模块,活着使用as关键字指定别名。
mod front_of_house {
fn cook_order() {}
pub mod hosting {
pub fn add_to_wait_list() {
super::cook_order();
crate::front_of_house::cook_order()
}
}
}
// 导入模块路径到当前作用域
use crate::front_of_house::hosting;
fn handle() {
// 直接使用导入后的路径调用
hosting::add_to_wait_list()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编辑 (opens new window)
上次更新: 2024/01/15, 02:08:26