Rust 基础-包和模块(第四章)

1. wiki

Rust 提供了许多功能来管理代码的组织:

  • 包(Packages): Cargo 的一个功能,它允许你构建、测试和分享 crate。
  • Crates :一个模块的树形结构,它形成了库或二进制项目。
  • 模块(Modules)和 use: 允许你控制作用域和路径的私有性。
  • 路径(path):一个命名例如结构体、函数或模块等项的方式

1. 包和 crate

  • crate 是 Rust 在编译时最小的代码单位,编译器以它为起始点,两种形式:
    • 二进制项:可以被编译为可执行程序,必须有一个 main 函数,如一个命令行程序或一个 server
    • 库:不会编译为可执行程序,没有 main 函数,它提供一些诸如函数之类的东西,大多时候是库
  • 包是提供一系列功能的一个或者多个 crate,一个包会包含有一个 Cargo.toml 文件,阐述如何去构建这些 crate

包的规则:

  • 一个包中至多只能包含一个库 crate(library crate)
  • 包中可以包含任意多个二进制 crate(binary crate)
  • 包中至少包含一个 crate,无论是库的还是二进制的

包的基本结构:

  • 唯一库包:src/lib.rs
  • 默认二进制包:src/main.rs,编译后生成的可执行文件与 Package 同名
  • 其余二进制包:src/bin/main1.rssrc/bin/main2.rs,它们会分别生成一个文件同名的二进制可执行文件
  • 集成测试文件:tests 目录下
  • 基准性能测试 benchmark 文件:benches 目录下
  • 项目示例:examples 目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── Cargo.toml
├── Cargo.lock
├── src
│ ├── main.rs
│ ├── lib.rs
│ └── bin
│ └── main1.rs
│ └── main2.rs
├── tests
│ └── some_integration_tests.rs
├── benches
│ └── simple_bench.rs
└── examples
└── simple_example.rs

2. 模块

模块可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的私有性,默认是私有的。使用关键字 mod 来定义模块,规则如下:

  • 使用 mod 关键字来创建新模块,后面紧跟着模块名
  • 模块可以嵌套
  • 模块中可以定义各种 Rust 类型,如函数、结构体、枚举、特征等
  • 所有模块均定义在同一个文件中
  • 父模块无法访问子模块中的私有项,但是子模块却可以访问父模块的
  • 可以使用 pub 关键字,控制模块和模块中指定项的可见性
  • 使用 superself 关键字,简化相对路径引用
  • 将结构体设置为 pub,但它的所有字段依然是私有的
  • 将枚举设置为 pub,它的所有字段也将对外可见
  • 使用 use 关键字将名称引入作用域