在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → rust程序设计语言简体中文

rust程序设计语言简体中文

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:5.44M
  • 下载次数:21
  • 浏览次数:81
  • 发布时间:2022-09-29
  • 实例类别:一般编程问题
  • 发 布 人:yaokaiwh
  • 文件格式:.pdf
  • 所需积分:2
 相关标签: 程序设计 rust 设计 程序 简体

实例介绍

【实例简介】rust程序设计语言简体中文

【实例截图】

【核心代码】

Contents
Rust 程序设计语言
11
前言
13
简介
15
1 入门指南
23
1.1 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.1.1 命令行标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.1.2 在 Linux 或 macOS 上安装 rustup . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.1.3 在 Windows 上安装 rustup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.1.4 检查安装是否正确(Troubleshooting) . . . . . . . . . . . . . . . . . . . . . . . .
25
1.2 更新与卸载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
1.2.1 本地文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
1.3 Hello, World! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.3.1 创建项目目录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.3.2 编写并运行 Rust 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.3.3 分析这个 Rust 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
1.3.4 编译和运行是彼此独立的步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
1.4 Hello, Cargo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
1.4.1 使用 Cargo 创建项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
1.4.2 构建并运行 Cargo 项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
1.4.3 发布(release)构建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
1.4.4 把 Cargo 当作习惯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
1.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2 写个猜数字游戏
35
2.1 准备一个新项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.2 处理一次猜测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.2.1 使用变量储存值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
2.2.2 接收用户输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
2.2.3 使用 Result 类型来处理潜在的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.4 使用 println! 占位符打印值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2.5 测试第一部分代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3 生成一个秘密数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.1 使用 crate 来增加更多功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.2 生成一个随机数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.4 比较猜测的数字和秘密数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.5 使用循环来允许多次猜测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
2.5.1 猜测正确后退出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
2.5.2 处理无效输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
2.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
3 常见编程概念
57
3.1 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
3.2 变量和可变性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
3.2.1 常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
34
CONTENTS
3.2.2 隐藏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
3.3 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
3.3.1 标量类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
3.3.2 复合类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
3.4 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
3.4.1 参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
3.4.2 语句和表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
3.4.3 具有返回值的函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
3.5 注释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
3.6 控制流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
3.6.1 if 表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
3.6.2 使用循环重复执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
3.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
4 认识所有权
85
4.1 什么是所有权? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
4.1.1 栈(Stack)与堆(Heap) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
4.1.2 所有权规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
4.1.3 变量作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
4.1.4 String 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
4.1.5 内存与分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
4.1.6 所有权与函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
4.1.7 返回值与作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
4.2 引用与借用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
4.2.1 可变引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
4.2.2 悬垂引用(Dangling References) . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2.3 引用的规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3 Slice 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.3.1 字符串 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.3.2 其他类型的 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5 使用结构体组织相关联的数据
113
5.1 结构体的定义和实例化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.1.1 使用字段初始化简写语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.1.2 使用结构体更新语法从其他实例创建实例 . . . . . . . . . . . . . . . . . . . . . . . . 116
5.1.3 使用没有命名字段的元组结构体来创建不同的类型 . . . . . . . . . . . . . . . . . . . 117
5.1.4 没有任何字段的类单元结构体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.1.5 结构体数据的所有权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.2 结构体示例程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.2.1 使用元组重构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.2 使用结构体重构:赋予更多意义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.3 通过派生 trait 增加实用功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.3 方法语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.3.1 定义方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.3.2 -> 运算符到哪去了? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.3 带有更多参数的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3.4 关联函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5.3.5 多个 impl 块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
5.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6 枚举和模式匹配
133
6.1 枚举的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
6.1.1 枚举值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.1.2 Option 枚举和其相对于空值的优势 . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.2 match 控制流结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.2.1 绑定值的模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.2.2 匹配 Option<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142CONTENTS
5
6.2.3 匹配是穷尽的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.2.4 通配模式和 _ 占位符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.3 if let 简洁控制流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7 使用包、Crate 和模块管理不断增长的项目
151
7.1 包和 Crate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
7.2 定义模块来控制作用域与私有性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.3 引用模块项目的路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.3.1 使用 pub 关键字暴露路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.3.2 使用 super 起始的相对路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
7.3.3 创建公有的结构体和枚举 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.4 使用 use 关键字将路径引入作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
7.4.1 创建惯用的 use 路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.4.2 使用 as 关键字提供新的名称 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.4.3 使用 pub use 重导出名称 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.4.4 使用外部包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.4.5 嵌套路径来消除大量的 use 行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
7.4.6 通过 glob 运算符将所有的公有定义引入作用域 . . . . . . . . . . . . . . . . . . . . 166
7.5 将模块拆分成多个文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
7.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
8 常见集合
171
8.1 使用 Vector 储存列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.1 新建 vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.2 更新 vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.3 丢弃 vector 时也会丢弃其所有元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
8.1.4 读取 vector 的元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
8.1.5 遍历 vector 中的元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
8.1.6 使用枚举来储存多种类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.2 使用字符串储存 UTF-8 编码的文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.1 什么是字符串? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.2 新建字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.3 更新字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.2.4 索引字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.2.5 字符串 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.2.6 遍历字符串的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.2.7 字符串并不简单 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.3 使用 Hash Map 储存键值对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
8.3.1 新建一个哈希 map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
8.3.2 哈希 map 和所有权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
8.3.3 访问哈希 map 中的值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
8.3.4 更新哈希 map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
8.3.5 哈希函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
8.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
9 错误处理
191
9.1 用 panic! 处理不可恢复的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
9.1.1 对应 panic 时的栈展开或终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
9.1.2 使用 panic! 的 backtrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
9.2 用 Result 处理可恢复的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
9.2.1 匹配不同的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
9.2.2 失败时 panic 的简写:unwrap 和 expect . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.3 传播错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.4 传播错误的简写:? 运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
9.2.5 哪里可以使用 ? 运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
9.3 要不要 panic! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
9.3.1 示例、代码原型和测试都非常适合 panic . . . . . . . . . . . . . . . . . . . . . . . . 2036
CONTENTS
9.3.2 当我们比编译器知道更多的情况 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
9.3.3 错误处理指导原则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
9.3.4 创建自定义类型进行有效性验证 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
9.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
10 泛型、Trait 和生命周期
209
10.1 提取函数来减少重复 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
10.2 泛型数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
10.2.1 在函数定义中使用泛型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
10.2.2 结构体定义中的泛型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
10.2.3 枚举定义中的泛型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
10.2.4 方法定义中的泛型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
10.2.5 泛型代码的性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
10.3 Trait:定义共同行为 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.3.1 定义 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.3.2 为类型实现 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.3.3 默认实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
10.3.4 trait 作为参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
10.3.5 返回实现了 trait 的类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
10.3.6 使用 trait bounds 来修复 largest 函数 . . . . . . . . . . . . . . . . . . . . . . . 227
10.3.7 使用 trait bound 有条件地实现方法 . . . . . . . . . . . . . . . . . . . . . . . . . . 229
10.4 生命周期确保引用有效 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
10.4.1 生命周期避免了悬垂引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
10.4.2 函数中的泛型生命周期 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10.4.3 生命周期注解语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
10.4.4 函数签名中的生命周期注解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
10.4.5 深入理解生命周期 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
10.4.6 结构体定义中的生命周期注解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
10.4.7 生命周期省略(Lifetime Elision) . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
10.4.8 方法定义中的生命周期注解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
10.4.9 静态生命周期 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
10.4.10 结合泛型类型参数、trait bounds 和生命周期 . . . . . . . . . . . . . . . . . . . . 242
10.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
11 编写自动化测试
245
11.1 如何编写测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
11.1.1 测试函数剖析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
11.1.2 使用 assert! 宏来检查结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
11.1.3 使用 assert_eq! 和 assert_ne! 宏来测试相等 . . . . . . . . . . . . . . . . . . 253
11.1.4 自定义失败信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
11.1.5 使用 should_panic 检查 panic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
11.1.6 将 Result<T, E> 用于测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
11.2 控制测试如何运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
11.2.1 并行或连续的运行测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
11.2.2 显示函数输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
11.2.3 通过指定名字来运行部分测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
11.2.4 忽略某些测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
11.3 测试的组织结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
11.3.1 单元测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
11.3.2 集成测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
11.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
12 一个 I∕O 项目:构建一个命令行程序
275
12.0.1 接受命令行参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.0.2 读取参数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
12.0.3 args 函数和无效的 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
12.0.4 将参数值保存进变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
12.0.5 读取文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278CONTENTS
7
12.1 重构改进模块性和错误处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
12.1.1 二进制项目的关注分离 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
12.1.2 提取参数解析器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
12.1.3 组合配置值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
12.1.4 创建一个 Config 的构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
12.1.5 修复错误处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
12.1.6 从 main 提取逻辑 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
12.1.7 将代码拆分到库 crate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
12.2 采用测试驱动开发完善库的功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
12.2.1 编写失败测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
12.2.2 编写使测试通过的代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
12.3 处理环境变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
12.3.1 编写一个大小写不敏感 search 函数的失败测试 . . . . . . . . . . . . . . . . . . . 304
12.3.2 实现 search_case_insensitive 函数 . . . . . . . . . . . . . . . . . . . . . . . 305
12.4 将错误信息输出到标准错误而不是标准输出 . . . . . . . . . . . . . . . . . . . . . . . . . . 315
12.4.1 检查错误应该写入何处 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
12.4.2 将错误打印到标准错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
12.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
13 Rust 中的函数式语言功能:迭代器与闭包
319
13.1 闭包:可以捕获环境的匿名函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
13.1.1 使用闭包创建行为的抽象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
13.1.2 闭包类型推断和注解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
13.1.3 使用带有泛型和 Fn trait 的闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
13.1.4 Cacher 实现的限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
13.1.5 闭包会捕获其环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
13.2 使用迭代器处理元素序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
13.2.1 Iterator trait 和 next 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
13.2.2 消费迭代器的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
13.2.3 产生其他迭代器的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
13.2.4 使用闭包获取环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
13.2.5 实现 Iterator trait 来创建自定义迭代器 . . . . . . . . . . . . . . . . . . . . . . 338
13.3 改进 I∕O 项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
13.3.1 使用迭代器并去掉 clone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
13.3.2 使用迭代器适配器来使代码更简明 . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
13.4 性能对比:循环 VS 迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
13.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
14 进一步认识 Cargo 和 Crates.io
357
14.1 采用发布配置自定义构建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
14.2 将 crate 发布到 Crates.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
14.2.1 编写有用的文档注释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
14.2.2 使用 pub use 导出合适的公有 API . . . . . . . . . . . . . . . . . . . . . . . . . . 362
14.2.3 创建 Crates.io 账号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
14.2.4 发布新 crate 之前 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
14.2.5 发布到 Crates.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
14.2.6 发布现存 crate 的新版本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
14.2.7 使用 cargo yank 从 Crates.io 撤回版本 . . . . . . . . . . . . . . . . . . . . . . . 367
14.3 Cargo 工作空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
14.3.1 创建工作空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
14.3.2 在工作空间中创建第二个包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
14.4 使用 cargo install 从 Crates.io 安装二进制文件 . . . . . . . . . . . . . . . . . . . . . 374
14.5 Cargo 自定义扩展命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
14.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
15 智能指针
377
15.1 使用 Box <T> 指向堆上的数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
15.1.1 使用 Box<T> 在堆上储存数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3788
CONTENTS
15.1.2 Box 允许创建递归类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
15.1.3 计算非递归类型的大小 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
15.1.4 使用 Box<T> 给递归类型一个已知的大小 . . . . . . . . . . . . . . . . . . . . . . . 381
15.2 通过 Deref trait 将智能指针当作常规引用处理 . . . . . . . . . . . . . . . . . . . . . . . . 384
15.2.1 通过解引用运算符追踪指针的值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
15.2.2 像引用一样使用 Box<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
15.2.3 自定义智能指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
15.2.4 通过实现 Deref trait 将某类型像引用一样处理 . . . . . . . . . . . . . . . . . . . . 386
15.2.5 函数和方法的隐式 Deref 强制转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
15.2.6 Deref 强制转换如何与可变性交互 . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
15.3 使用 Drop Trait 运行清理代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
15.4 Rc<T> 引用计数智能指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
15.4.1 使用 Rc<T> 共享数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
15.4.2 克隆 Rc<T> 会增加引用计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
15.5 RefCell<T> 和内部可变性模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
15.5.1 通过 RefCell<T> 在运行时检查借用规则 . . . . . . . . . . . . . . . . . . . . . . 398
15.5.2 内部可变性:不可变值的可变借用 . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
15.5.3 RefCell<T> 在运行时记录借用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
15.5.4 结合 Rc<T> 和 RefCell<T> 来拥有多个可变数据所有者 . . . . . . . . . . . . . . 406
15.6 引用循环与内存泄漏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
15.6.1 制造引用循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
15.6.2 避免引用循环:将 Rc<T> 变为 Weak<T> . . . . . . . . . . . . . . . . . . . . . . . 410
15.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
16 无畏并发
417
16.1 使用线程同时运行代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
16.1.1 使用 spawn 创建新线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
16.1.2 线程与 move 闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
16.2 使用消息传递在线程间传送数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
16.2.1 信道与所有权转移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
16.2.2 发送多个值并观察接收者的等待 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
16.2.3 通过克隆发送者来创建多个生产者 . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
16.3 共享状态并发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
16.3.1 互斥器一次只允许一个线程访问数据 . . . . . . . . . . . . . . . . . . . . . . . . . . 430
16.3.2 Mutex<T> 的 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
16.3.3 RefCell<T>∕Rc<T> 与 Mutex<T>∕Arc<T> 的相似性 . . . . . . . . . . . . . . . 434
16.4 使用 Sync 和 Send trait 的可扩展并发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
16.4.1 通过 Send 允许在线程间转移所有权 . . . . . . . . . . . . . . . . . . . . . . . . . . 435
16.4.2 Sync 允许多线程访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
16.4.3 手动实现 Send 和 Sync 是不安全的 . . . . . . . . . . . . . . . . . . . . . . . . . . 435
16.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
17 Rust 的面向对象特性
437
17.1 面向对象语言的特征 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
17.1.1 对象包含数据和行为 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
17.1.2 封装隐藏了实现细节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
17.2 继承,作为类型系统与代码共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
17.3 顾及不同类型值的 trait 对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
17.3.1 定义通用行为的 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
17.3.2 实现 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
17.3.3 trait 对象执行动态分发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
17.3.4 trait 对象需要类型安全 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
17.4 面向对象设计模式的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
17.4.1 定义 Post 并新建一个草案状态的实例 . . . . . . . . . . . . . . . . . . . . . . . . . 449
17.4.2 存放博文内容的文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
17.4.3 确保博文草案的内容是空的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
17.4.4 请求审核博文来改变其状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
17.4.5 增加改变 content 行为的 approve 方法 . . . . . . . . . . . . . . . . . . . . . . . 452CONTENTS
9
17.4.6 状态模式的权衡取舍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
17.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
18 模式与模式匹配
463
18.1 所有可能会用到模式的位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
18.1.1 match 分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
18.1.2 if let 条件表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
18.1.3 while let 条件循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
18.1.4 for 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
18.1.5 let 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
18.1.6 函数参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
18.2 Refutability(可反驳性): 模式是否会匹配失效 . . . . . . . . . . . . . . . . . . . . . . . 469
18.3 所有的模式语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
18.3.1 匹配字面值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
18.3.2 匹配命名变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
18.3.3 多个模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
18.3.4 通过 ..= 匹配值的范围 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
18.3.5 解构并分解值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
18.3.6 忽略模式中的值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
18.3.7 匹配守卫提供的额外条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
18.3.8 @ 绑定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
18.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
19 高级特征
485
19.1 不安全 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
19.1.1 不安全的超能力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
19.1.2 解引用裸指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
19.1.3 调用不安全函数或方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
19.1.4 访问或修改可变静态变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
19.1.5 实现不安全 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
19.1.6 访问联合体中的字段 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
19.1.7 何时使用不安全代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
19.2 高级 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
19.2.1 关联类型在 trait 定义中指定占位符类型 . . . . . . . . . . . . . . . . . . . . . . . . 494
19.2.2 默认泛型类型参数和运算符重载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
19.2.3 完全限定语法与消歧义:调用相同名称的方法 . . . . . . . . . . . . . . . . . . . . 497
19.2.4 父 trait 用于在另一个 trait 中使用某 trait 的功能 . . . . . . . . . . . . . . . . . . . 502
19.2.5 newtype 模式用以在外部类型上实现外部 trait . . . . . . . . . . . . . . . . . . . . 504
19.3 高级类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
19.3.1 为了类型安全和抽象而使用 newtype 模式 . . . . . . . . . . . . . . . . . . . . . . 506
19.3.2 类型别名用来创建类型同义词 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
19.3.3 从不返回的 never type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
19.3.4 动态大小类型和 Sized trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
19.4 高级函数与闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
19.4.1 函数指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
19.4.2 返回闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
19.5 宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
19.5.1 宏和函数的区别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
19.5.2 使用 macro_rules! 的声明宏用于通用元编程 . . . . . . . . . . . . . . . . . . . 515
19.5.3 用于从属性生成代码的过程宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
19.5.4 如何编写自定义 derive 宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
19.5.5 类属性宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
19.5.6 类函数宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
19.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
20 最后的项目: 构建多线程 web server
525
20.1 构建单线程 web server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
20.1.1 监听 TCP 连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52710
CONTENTS
20.1.2 读取请求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
20.1.3 编写响应 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
20.1.4 返回真正的 HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
20.1.5 验证请求并有选择的进行响应 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
20.1.6 少量代码重构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
20.2 将单线程 server 变为多线程 server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
20.2.1 在当前 server 实现中模拟慢请求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
20.2.2 使用线程池改善吞吐量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
20.3 优雅停机与清理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
20.3.1 为 ThreadPool 实现 Drop Trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
20.3.2 向线程发送信号使其停止接收任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
20.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
21 附录
577
21.1 附录 A:关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
21.1.1 目前正在使用的关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
21.1.2 保留做将来使用的关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
21.1.3 原始标识符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
21.2 附录 B:运算符与符号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
21.2.1 运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
21.2.2 非运算符符号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
21.3 附录 C:可派生的 trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
21.3.1 用于程序员输出的 Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
21.3.2 等值比较的 PartialEq 和 Eq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
21.3.3 次序比较的 PartialOrd 和 Ord . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
21.3.4 复制值的 Clone 和 Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
21.3.5 固定大小的值到值映射的 Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
21.3.6 默认值的 Default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
21.4 附录 D:实用开发工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
21.4.1 通过 rustfmt 自动格式化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
21.4.2 通过 rustfix 修复代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
21.4.3 通过 clippy 提供更多 lint 功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
21.4.4 使用 rust-analyzer 的 IDE 集成 . . . . . . . . . . . . . . . . . . . . . . . . . . 589
21.5 附录 E:版本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
21.6 附录 F:本书译本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
21.7 附录 G:Rust 是如何开发的与 ”Nightly Rust” . . . . . . . . . . . . . . . . . . . . . . . . . 592
21.7.1 无停滞稳定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
21.7.2 Choo, Choo! (开车啦,逃)发布通道和发布时刻表(Riding the Trains) . . . . 592
21.7.3 不稳定功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
21.7.4 Rustup 和 Rust Nightly 的职责 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
21.7.5 RFC 过程和团队 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594Rust 程序设计语言

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警