8.1 包和 Crate
8.1.1 基本概念
- crate 是 Rust 在编译时最小的代码单位;crate 有两种形式:二进制项(可以被编译为可执行程序)和库(没有 main 函数,也不会编译为可执行程序,而是提供一些诸如函数之类的东西,使其他项目也能使用这些东西)
- **包(package)**是提供一系列功能的一个或者多个 crate;包中可以包含至多一个库 crate(library crate),也可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)
8.2 模块的作用域与私有性
8.2.1 模块的相关概念
8.2.1 使用模块对相关代码进行分组
8.3 模块的路径
8.3.1 绝对路径与相对路径
8.3.2 使用 pub 关键字暴露路径
- 模块公有并不使其内容也是公有的:模块上的 pub 关键字只允许其父模块引用它,而不允许访问内部代码;模块是一个容器,只是将模块变为公有能做的其实并不太多,同时需要更深入地选择将一个或多个项变为公有(即添加
pub
前缀)
8.3.3 使用 super 起始的相对路径
8.3.4 创建公有的结构体和枚举
- 结构体:在一个结构体定义的前面使用了 pub ,这个结构体会变成公有的,但是这个结构体的字段仍然是私有的(其字段默认未私有的,可以根据情况决定每个字段是否公有)
- 枚举:其成员默认就是公有的
8.4 使用 use 关键字将路径引入作用域
8.4.1 use 的作用域
- 注意:
use
只能创建use
当前所在的特定作用域内的短路径(比如:可用于在当前模块,切换到其他模块则需重新导入)
8.4.2 use 的使用习惯
- 使用
use
时,一般是引入一个模块(而不是直接引入某些函数),在调用函数时需要指定父模块
8.4.3 as 关键字
8.4.4 pub use:重导出名称
-
use some_mod
:仅在当前作用域生效,对外仍是私有的 -
pub use some_mod
:不仅在当前作用域生效,还可导入到其他作用域生效
8.4.5 使用外部包
- 对于外部包,需要先在
Cargo.toml
文件中添加所需的包,再使用use
来导入包 - 对于标准库,则直接
use
导入包即可
8.4.6 使用 {} 嵌套路径来简化 use 的使用
- 举例:
use std::{cmp::Ordering, io};
、use std::io::{self, Write};
8.4.7 通过 glob 运算符将所有的公有定义引入作用域
8.5 将模块拆分成多个文件