1. 概述
1.1 名词
package:包
crate:单元包
module:模块
1.2 代码组织
rust的代码组织主要包括以下
- 哪些细节可以暴露,哪些细节是私有的
- 作用域内哪些名称有效
这些功能有时候统称为模块系统,模块系统包含如下内容
- Package(包):一个包含一个 Cargo.toml 文件和源代码树的文件夹。一个包可以包含多个二进制 crate 和可选的一个库 crate。包的名称来自 Cargo.toml 文件中的 name 字段。
- Crate(共享包):一个 crate 是一个编译为 lib 或者二进制文件的 Rust 项目单元。一个包中有一个库 crate(lib.rs),和零个或多个二进制 crate(main.rs)。crate 可以嵌套,并形成一个 crate 树。
- Module(模块)、use:让你控制代码的组织、作用域、私有路径。模块是 Rust 中的命名空间系统,用于创建库的内部层次结构,以便将功能划分为多个抽象层次,并控制项目中的项的可见性。模块也可以嵌套,并形成一个模块树。
- Path(路径):为struct、function或者module等项命名的方式
2. package和Crate
2.1 Crate的类型
- binary
- library
2.2 Crate Root
- 是源代码文件
- Rust编译器是从这里开始,组成你的Crate的根的Module,也就是说它是一个入口文件
2.3 Package
- 包含一个
Cargo.toml,它描述了如何构建这些Crates - 最多包含1个library crate
- 可以包含任意数量的binary crate
- 必须至少包含一个crate(library或binary)
当我们使用cargo new命令创建一个项目时,对应的项目就是一个binary类型的package。
cargo会将src/main.rs最为binary crate的根,crate的名与package的名是相同的;如果我们的项目下存在src/lib.rs文件,那么该package就是包含一个library crate,该crate是library crate的根,这个crate的名与package的名也是相同的。
cargo会把crate root文件交给rustc来构建library或binary。
2.3 cargo的惯例
一个package可以同时包含src/mian.rs和src/lib.rs,一个 binary crate,一个 library crate,名称与package相同。
一个package可以有多个binary crate,文件放在src/bin下,放在该目录下的每个文件都是单独的binary crate。
2.4 crate的作用
crate将相关的功能组合到一个作用域内,便于在项目间进行共享,防止冲突。例如使用rand crate,访问它的功能需要通过他的名字:rand。
3. 定义Module
定义module来控制作用域和私有性,Module的作用如下
- 在一个crate内,将代码进行分组
- 增加可读性,易于复用
- 控制项目(item)的访问属性性,public、private
通过module关键字来建立module,module是可嵌套的,在子module可包含其他项目(struct、enum、常量、trait、函数等)的定义。如下示例代码
mod front_of_house {
mod hosting {
fn add_to_wailist() {}
fn seat_at_table() {}
}
mod serving {
fn take_order() {}
fn serving() {}
fn take_payment() {}
}
}
以上代码结构如下图所示
src/main.rs和src/lib.rs叫做crate roots。这两个文件(任意一个)的内容形成了名为crate的模块,位于整个模块树的根部。