一、包和Crate
- 一个包至多只能包含一个库crate
- 包中可以包含任意多个二进制crate
- 包中至少包含一个crate,不区分类型
src/main.rs 就是一个与包同名的二进制 crate 的 crate 根。
src/bin -> 二进制crate
src/lib.rs -> 库crate
src/main.rc -> 二进制crate
二、定义模块,以控制作用域与私有性
使用 mod 关键字定义模块。
沿用家庭关系的比喻,如果一个模块 A 被包含在模块 B 中,我们将模块 A 称为模块 B 的 子(child),模块 B 则是模块 A 的 父(parent)。
三、路径,用于引用模块树中的项
Rust 私有性边界:不允许外部代码了解、调用和依赖被封装的实现细节。
若希望创建一个私有函数或构造体,可以使用模块 mod。
Rust中默认所有项:函数、方法、结构体、枚举、模块和常量,都是私有的。
可以使用crate开头实现绝对路径使用模块。
也可以使用super开头来构建从父模块开始的相对路径。(类似于 ../ )方便在内嵌较深的函数下引用其他模块的函数。
四、use关键字,将名称引入作用域
使用use关键字将模块下函数显示声明,后续即可直接使用该函数,无需加上一长串的前缀。
应当创建惯用的use路径,而不是具体的某个函数,这样很不方便使用。
当使用use引入:结构体、枚举,习惯性指定他们完整的路径。
如何使用use将两个同名类型引入同一作用域?
在这个类型的路径后面,使用as关键字指定一个新的本地名称或者别名。
可以使用 pub + use 重导出名称。
标准库(std)对于你的包来说也是外部crate。
可以使用嵌套路径消除大量路径相同部分。
若想引入所有项,则可以在指定路径后使用*.(问题是会使得当前包下难以推导作用域中有什么名称以及何处定义)
五、模块分割
- 以分割模块命名文件
- 通过mod 关键字引入模块
- 使用模块,可以使用use 关键字设置别名
文件路径即模块路径,且命名一致。