Rust程序设计(图灵出品)
前言 xv
第 1 章 为什么是Rust 1
第 2 章 Rust初体验 5
2.1 下载和安装Rust 5
2.2 一个简单的函数 7
2.3 编写和运行单元测试 9
2.4 处理命令行参数 9
2.5 一个简单的Web服务器 13
2.6 并发 19
2.6.1 到底什么是曼德布洛特集合 19
查看完整
第 1 章 为什么是Rust 1
第 2 章 Rust初体验 5
2.1 下载和安装Rust 5
2.2 一个简单的函数 7
2.3 编写和运行单元测试 9
2.4 处理命令行参数 9
2.5 一个简单的Web服务器 13
2.6 并发 19
2.6.1 到底什么是曼德布洛特集合 19
查看完整
吉姆·布兰迪(Jim Blandy)Mozilla软件工程师,拥有近40年编程经验和30年自由软件开发经验,是Subversion版本控制系统最初的设计者之一。
贾森·奥伦多夫(Jason Orendorff)资深软件工程师,拥有20余年软件开发经验,目前在为Mozilla Firefox Web浏览器开发JavaScript引擎。
【译者介绍】
360前端开发资深专家、前端TC委员、W3C AC代表,任职于“奇舞团”,也是360 Web字体服务“奇字库”作者。
贾森·奥伦多夫(Jason Orendorff)资深软件工程师,拥有20余年软件开发经验,目前在为Mozilla Firefox Web浏览器开发JavaScript引擎。
【译者介绍】
360前端开发资深专家、前端TC委员、W3C AC代表,任职于“奇舞团”,也是360 Web字体服务“奇字库”作者。
本书由两位经验丰富的系统程序员撰写,介绍了一种具有C和C++性能,同时安全且支持并发的新型系统编程语言Rust,解释了Rust如何在性能和安全性之间架起桥梁,以及我们如何用好这门语言。书中主要内容包括:Rust的基本数据类型,关于所有权、引用等概念,表达式、错误处理、包和模块、结构体、枚举与模式等基础知识,Rust语言的特型与泛型,闭包,迭代器,集合,等等。
前言 xv
第 1 章 为什么是Rust 1
第 2 章 Rust初体验 5
2.1 下载和安装Rust 5
2.2 一个简单的函数 7
2.3 编写和运行单元测试 9
2.4 处理命令行参数 9
2.5 一个简单的Web服务器 13
2.6 并发 19
2.6.1 到底什么是曼德布洛特集合 19
2.6.2 解析成对的命令行参数 23
2.6.3 像素到复数的映射 25
2.6.4 绘制集合 26
2.6.5 写出图像文件 27
2.6.6 并发的曼德布洛特程序 29
2.6.7 运行曼德布洛特绘图器 32
2.6.8 安全无形 34
第 3 章 基本类型 35
3.1 机器类型 38
3.1.1 整数类型 38
3.1.2 浮点类型 40
3.1.3 布尔类型 42
3.1.4 字符类型 43
3.2 元组 44
3.3 指针类型 45
3.3.1 引用 46
3.3.2 Box 46
3.3.3 原始指针 46
3.4 数组、向量和切片 47
3.4.1 数组 47
3.4.2 向量 48
3.4.3 逐个元素地构建向量 51
3.4.4 切片 51
3.5 字符串类型 52
3.5.1 字符串字面量 52
3.5.2 字节字符串 53
3.5.3 字符串在内存中的表示 53
3.5.4 字符串 55
3.5.5 使用字符串 56
3.5.6 其他类似字符串的类型 56
3.6 更多类型 57
第 4 章 所有权 58
4.1 所有权 59
4.2 转移 63
4.2.1 更多转移操作 68
4.2.2 转移与控制流 69
4.2.3 转移与索引内容 69
4.3 Copy类型:转移的例外 71
4.4 Rc和Arc:共享所有权 74
第 5 章 引用 76
5.1 引用作为值 79
5.1.1 Rust引用与C++引用 79
5.1.2 给引用赋值 80
5.1.3 引用的引用 81
5.1.4 比较引用 81
5.1.5 引用永远不为空 82
5.1.6 借用对任意表达式的引用 82
5.1.7 对切片和特型对象的引用 83
5.2 引用安全 83
5.2.1 借用局部变量 83
5.2.2 接收引用作为参数 86
5.2.3 将引用作为参数传递 87
5.2.4 返回引用 88
5.2.5 结构体包含引用 89
5.2.6 不同的生命期参数 91
5.2.7 省略生命期参数 92
5.3 共享与修改 93
5.4 征服对象之海 99
第 6 章 表达式 101
6.1 表达式语言 101
6.2 块与分号 102
6.3 声明 103
6.4 if与match 105
6.5 循环 107
6.6 return表达式 109
6.7 为什么Rust有循环 110
6.8 函数与方法调用 111
6.9 字段与元素 112
6.10 引用操作符 113
6.11 算术、位、比较和逻辑操作符 113
6.12 赋值 114
6.13 类型转换 114
6.14 闭包 115
6.15 优先级与关联性 116
6.16 展望 118
第 7 章 错误处理 119
7.1 诧异 119
7.1.1 展开栈 120
7.1.2 中止进程 121
7.2 结果 121
7.2.1 捕获错误 121
7.2.2 结果类型别名 123
7.2.3 打印错误 123
7.2.4 传播错误 124
7.2.5 处理多种错误类型 125
7.2.6 处理“不会发生”的错误 127
7.2.7 忽略错误 128
7.2.8 在main()中处理错误 128
7.2.9 声明自定义错误类型 129
7.2.10 为什么是结果 130
第 8 章 包和模块 131
8.1 包 131
8.2 模块 134
8.2.1 把模块写在单独的文件中 135
8.2.2 路径和导入 136
8.2.3 标准前置模块 138
8.2.4 特性项,Rust的基础 139
8.3 将程序作为库发布 141
8.4 src/bin目录 142
8.5 属性 143
8.6 测试和文档 145
8.6.1 集成测试 147
8.6.2 文档 148
8.6.3 文档测试 149
8.7 指定依赖 152
8.7.1 版本 152
8.7.2 Cargo.lock 153
8.8 把包发布到crates.io 154
8.9 工作空间 156
8.10 还有惊喜 156
第 9 章 结构体 158
9.1 命名字段结构体 158
9.2 类元组结构体 161
9.3 类基元结构体 161
9.4 结构体布局 162
9.5 通过impl定义方法 162
9.6 泛型结构体 165
9.7 带生命期参数的结构体 167
9.8 为结构体类型派生共有特型 168
9.9 内部修改能力 168
第 10 章 枚举与模式 172
10.1 枚举 173
10.1.1 包含数据的枚举 175
10.1.2 枚举的内存布局 176
10.1.3 使用枚举的富数据结构 176
10.1.4 泛型枚举 178
10.2 模式 180
10.2.1 模式中的字面量、变量和通配符 183
10.2.2 元组与结构体模式 184
10.2.3 引用模式 185
10.2.4 匹配多种可能性 187
10.2.5 模式护具 188
10.2.6 @模式 188
10.2.7 在哪里使用模式 189
10.2.8 填充二叉树 190
10.3 设计的考量 191
第 11 章 特型与泛型 192
11.1 使用特型 193
11.1.1 特型目标 194
11.1.2 特型目标布局 195
11.1.3 泛型函数 196
11.1.4 使用哪一个 199
11.2 定义和实现特型 200
11.2.1 默认方法 201
11.2.2 特型与其他人的类型 202
11.2.3 特型中的Self 204
11.2.4 子特型 205
11.2.5 静态方法 205
11.3 完全限定方法调用 207
11.4 定义类型关系的特型 208
11.4.1 关联类型(或迭代器工作原理) 208
11.4.2 泛型特型(或操作符重载的原理) 211
11.4.3 伴型特型(或rand::random()工作原理) 212
11.5 逆向工程绑定 213
11.6 小结 216
第 12 章 操作符重载 217
12.1 算术与位操作符 218
12.1.1 一元操作符 220
12.1.2 二元操作符 221
12.1.3 复合赋值操作符 221
12.2 相等测试 222
12.3 顺序比较 225
12.4 Index与IndexMut 227
12.5 其他操作符 229
第 13 章 实用特型 230
13.1 Drop 231
13.2 Sized 233
13.3 Clone 235
13.4 Copy 236
13.5 Deref与DerefMut 237
13.6 Default 239
13.7 AsRef与AsMut 241
13.8 Borrow与BorrowMut 242
13.9 From与Into 244
13.10 ToOwned 245
13.11 Borrow与ToOwned实例:谦逊的奶牛(Cow) 246
第 14 章 闭包 248
14.1 捕获变量 249
14.1.1 借用值的闭包 250
14.1.2 盗用值的闭包 250
14.2 函数与闭包类型 252
14.3 闭包的性能 254
14.4 闭包和安全 255
14.4.1 杀值的闭包 255
14.4.2 FnOnce 256
14.4.3 FnMut 257
14.5 回调 259
14.6 有效使用闭包 261
第 15 章 迭代器 263
15.1 Iterator和IntoIterator特型 264
15.2 创建迭代器 265
15.2.1 iter和iter_mut方法 265
15.2.2 IntoIterator实现 266
15.2.3 drain方法 268
15.2.4 其他迭代器源 268
15.3 迭代器适配器 269
15.3.1 map和filter 269
15.3.2 filter_map和flat_map 271
15.3.3 scan 273
15.3.4 take和take_while 274
15.3.5 skip和skip_while 274
15.3.6 peekable 275
15.3.7 fuse 276
15.3.8 可逆迭代器与rev 277
15.3.9 inspect 278
15.3.10 chain 278
15.3.11 enumerate 279
15.3.12 zip 279
15.3.13 by_ref 280
15.3.14 cloned 281
15.3.15 cycle 281
15.4 消费迭代器 282
15.4.1 简单累计:count、sum和product 282
15.4.2 max和min 283
15.4.3 max_by和min_by 283
15.4.4 max_by_key和min_by_key 283
15.4.5 比较项序列 284
15.4.6 any和all 285
15.4.7 position、rposition和ExactSizeIterator 285
15.4.8 fold 285
15.4.9 nth 286
15.4.10 last 286
15.4.11 find 287
15.4.12 构建集合:collect和FromIterator 287
15.4.13 Extend特型 289
15.4.14 partition 289
15.5 实现自己的迭代器 290
第 16 章 集合 294
16.1 概述 295
16.2 Vec 296
16.2.1 访问元素 296
16.2.2 迭代 298
16.2.3 增长和收缩向量 298
16.2.4 连接 300
16.2.5 拆分 301
16.2.6 交换 303
16.2.7 排序和搜索 303
16.2.8 比较切片 304
16.2.9 随机元素 305
16.2.10 Rust排除无效错误 305
16.3 VecDeque 306
16.4 LinkedList 307
16.5 BinaryHeap 308
16.6 HashMap和BTreeMap 309
16.6.1 条目 311
16.6.2 映射迭代 313
16.7 HashSet和BTreeSet 313
16.7.1 集迭代 314
16.7.2 相等的值不相同 314
16.7.3 整集操作 315
16.8 散列 316
16.9 标准集合之外 318
第 17 章 字符串与文本 319
17.1 Unicode背景知识 319
17.1.1 ASCII、Latin-1和Unicode 320
17.1.2 UTF-8 320
17.1.3 文本方向性 322
17.2 字符(char) 322
17.2.1 字符分类 322
17.2.2 处理数字 322
17.2.3 字符大小写转换 323
17.2.4 与整数相互转换 324
17.3 String与str 324
17.3.1 创建字符串值 325
17.3.2 简单检查 325
17.3.3 追加和插入文本 326
17.3.4 删除文本 327
17.3.5 搜索与迭代的约定 327
17.3.6 搜索文本的模式 328
17.3.7 搜索与替换 328
17.3.8 迭代文本 329
17.3.9 修剪 331
17.3.10 字符串大小写转换 331
17.3.11 从字符串解析出其他类型 331
17.3.12 将其他类型转换为字符串 332
17.3.13 作为其他类文本类型借用 333
17.3.14 访问UTF-8格式的文本 333
17.3.15 从UTF-8数据产生文本 334
17.3.16 阻止分配 335
17.3.17 字符串作为泛型集合 336
17.4 格式化值 337
17.4.1 格式化文本值 338
17.4.2 格式化数值 339
17.4.3 格式化其他类型 341
17.4.4 为调试格式化值 341
17.4.5 为调试格式化指针 342
17.4.6 通过索引或名字引用参数 342
17.4.7 动态宽度与精度 343
17.4.8 格式化自定义类型 344
17.4.9 在你的代码中使用格式化语言 345
17.5 正则表达式 346
17.5.1 基本用法 347
17.5.2 懒构建Regex值 348
17.6 规范化 349
17.6.1 规范化形式 350
17.6.2 unicode-normalization包 351
第 18 章 输入和输出 352
18.1 读取器和写入器 353
18.1.1 读取器 354
18.1.2 缓冲读取器 355
18.1.3 读取文本行 356
18.1.4 收集行 358
18.1.5 写入器 359
18.1.6 文件 360
18.1.7 搜寻 360
18.1.8 其他读取器和写入器类型 361
18.1.9 二进制数据、压缩与序列化 362
18.2 文件与目录 364
18.2.1 OsStr和Path 364
18.2.2 Path和PathBuf的方法 365
18.2.3 文件系统访问函数 367
18.2.4 读取目录 368
18.2.5 平台特定的特性 369
18.3 网络编程 370
第 19 章 并发 373
19.1 并行分叉–合并 374
19.1.1 产生及合并 376
19.1.2 跨线程错误处理 377
19.1.3 跨线程共享不可修改数据 378
19.1.4 Rayon 380
19.1.5 重温曼德布洛特集合 382
19.2 通道 383
19.2.1 发送值 385
19.2.2 接收值 387
19.2.3 运行管道 388
19.2.4 通道特性与性能 390
19.2.5 线程安全:Send与Sync 391
19.2.6 将所有迭代器都接到通道上 393
19.2.7 超越管道 394
19.3 共享可修改状态 395
19.3.1 什么是互斥量 395
19.3.2 Mutex 397
19.3.3 mut与Mutex 398
19.3.4 互斥量的问题 399
19.3.5 死锁 399
19.3.6 中毒的互斥量 400
19.3.7 使用互斥量的多消费者通道 400
19.3.8 读/写锁(RwLock) 401
19.3.9 条件变量(Condvar)402
19.3.10 原子类型 403
19.3.11 全局变量 404
19.4 习惯编写Rust并发代码 406
第 20 章 宏 407
20.1 宏基础 408
20.1.1 宏扩展基础 409
20.1.2 意外结果 410
20.1.3 重复 411
20.2 内置宏 413
20.3 调试宏 414
20.4 json!宏 415
20.4.1 片段类型 416
20.4.2 在宏里使用递归 419
20.4.3 在宏里使用特型 419
20.4.4 作用域与自净宏 421
20.4.5 导入和导出宏 424
20.5 匹配时避免语法错误 425
20.6 超越macro_rules! 426
第 21 章 不安全代码 427
21.1 不安全源自哪里 428
21.2 不安全的块 429
21.3 不安全的函数 431
21.4 不安全的块还是不安全的函数 433
21.5 未定义行为 434
21.6 不安全的特型 435
21.7 原始指针 437
21.7.1 安全解引用原始指针 439
21.7.2 示例:RefWithFlag 440
21.7.3 可空指针 442
21.7.4 类型大小与对齐 442
21.7.5 指针算术 443
21.7.6 移入和移出内存 444
21.7.7 示例:GapBuffer 447
21.7.8 不安全代码中的诧异安全性 453
21.8 外来函数:在Rust中调用C和C++ 453
21.8.1 查找共有数据表示 454
21.8.2 声明外来函数和变量 456
21.8.3 使用库函数 458
21.8.4 libgit2的原始接口 461
21.8.5 libgit2的安全接口 466
21.9 小结 475
作者介绍 476
封面介绍 476
^ 收 起
第 1 章 为什么是Rust 1
第 2 章 Rust初体验 5
2.1 下载和安装Rust 5
2.2 一个简单的函数 7
2.3 编写和运行单元测试 9
2.4 处理命令行参数 9
2.5 一个简单的Web服务器 13
2.6 并发 19
2.6.1 到底什么是曼德布洛特集合 19
2.6.2 解析成对的命令行参数 23
2.6.3 像素到复数的映射 25
2.6.4 绘制集合 26
2.6.5 写出图像文件 27
2.6.6 并发的曼德布洛特程序 29
2.6.7 运行曼德布洛特绘图器 32
2.6.8 安全无形 34
第 3 章 基本类型 35
3.1 机器类型 38
3.1.1 整数类型 38
3.1.2 浮点类型 40
3.1.3 布尔类型 42
3.1.4 字符类型 43
3.2 元组 44
3.3 指针类型 45
3.3.1 引用 46
3.3.2 Box 46
3.3.3 原始指针 46
3.4 数组、向量和切片 47
3.4.1 数组 47
3.4.2 向量 48
3.4.3 逐个元素地构建向量 51
3.4.4 切片 51
3.5 字符串类型 52
3.5.1 字符串字面量 52
3.5.2 字节字符串 53
3.5.3 字符串在内存中的表示 53
3.5.4 字符串 55
3.5.5 使用字符串 56
3.5.6 其他类似字符串的类型 56
3.6 更多类型 57
第 4 章 所有权 58
4.1 所有权 59
4.2 转移 63
4.2.1 更多转移操作 68
4.2.2 转移与控制流 69
4.2.3 转移与索引内容 69
4.3 Copy类型:转移的例外 71
4.4 Rc和Arc:共享所有权 74
第 5 章 引用 76
5.1 引用作为值 79
5.1.1 Rust引用与C++引用 79
5.1.2 给引用赋值 80
5.1.3 引用的引用 81
5.1.4 比较引用 81
5.1.5 引用永远不为空 82
5.1.6 借用对任意表达式的引用 82
5.1.7 对切片和特型对象的引用 83
5.2 引用安全 83
5.2.1 借用局部变量 83
5.2.2 接收引用作为参数 86
5.2.3 将引用作为参数传递 87
5.2.4 返回引用 88
5.2.5 结构体包含引用 89
5.2.6 不同的生命期参数 91
5.2.7 省略生命期参数 92
5.3 共享与修改 93
5.4 征服对象之海 99
第 6 章 表达式 101
6.1 表达式语言 101
6.2 块与分号 102
6.3 声明 103
6.4 if与match 105
6.5 循环 107
6.6 return表达式 109
6.7 为什么Rust有循环 110
6.8 函数与方法调用 111
6.9 字段与元素 112
6.10 引用操作符 113
6.11 算术、位、比较和逻辑操作符 113
6.12 赋值 114
6.13 类型转换 114
6.14 闭包 115
6.15 优先级与关联性 116
6.16 展望 118
第 7 章 错误处理 119
7.1 诧异 119
7.1.1 展开栈 120
7.1.2 中止进程 121
7.2 结果 121
7.2.1 捕获错误 121
7.2.2 结果类型别名 123
7.2.3 打印错误 123
7.2.4 传播错误 124
7.2.5 处理多种错误类型 125
7.2.6 处理“不会发生”的错误 127
7.2.7 忽略错误 128
7.2.8 在main()中处理错误 128
7.2.9 声明自定义错误类型 129
7.2.10 为什么是结果 130
第 8 章 包和模块 131
8.1 包 131
8.2 模块 134
8.2.1 把模块写在单独的文件中 135
8.2.2 路径和导入 136
8.2.3 标准前置模块 138
8.2.4 特性项,Rust的基础 139
8.3 将程序作为库发布 141
8.4 src/bin目录 142
8.5 属性 143
8.6 测试和文档 145
8.6.1 集成测试 147
8.6.2 文档 148
8.6.3 文档测试 149
8.7 指定依赖 152
8.7.1 版本 152
8.7.2 Cargo.lock 153
8.8 把包发布到crates.io 154
8.9 工作空间 156
8.10 还有惊喜 156
第 9 章 结构体 158
9.1 命名字段结构体 158
9.2 类元组结构体 161
9.3 类基元结构体 161
9.4 结构体布局 162
9.5 通过impl定义方法 162
9.6 泛型结构体 165
9.7 带生命期参数的结构体 167
9.8 为结构体类型派生共有特型 168
9.9 内部修改能力 168
第 10 章 枚举与模式 172
10.1 枚举 173
10.1.1 包含数据的枚举 175
10.1.2 枚举的内存布局 176
10.1.3 使用枚举的富数据结构 176
10.1.4 泛型枚举 178
10.2 模式 180
10.2.1 模式中的字面量、变量和通配符 183
10.2.2 元组与结构体模式 184
10.2.3 引用模式 185
10.2.4 匹配多种可能性 187
10.2.5 模式护具 188
10.2.6 @模式 188
10.2.7 在哪里使用模式 189
10.2.8 填充二叉树 190
10.3 设计的考量 191
第 11 章 特型与泛型 192
11.1 使用特型 193
11.1.1 特型目标 194
11.1.2 特型目标布局 195
11.1.3 泛型函数 196
11.1.4 使用哪一个 199
11.2 定义和实现特型 200
11.2.1 默认方法 201
11.2.2 特型与其他人的类型 202
11.2.3 特型中的Self 204
11.2.4 子特型 205
11.2.5 静态方法 205
11.3 完全限定方法调用 207
11.4 定义类型关系的特型 208
11.4.1 关联类型(或迭代器工作原理) 208
11.4.2 泛型特型(或操作符重载的原理) 211
11.4.3 伴型特型(或rand::random()工作原理) 212
11.5 逆向工程绑定 213
11.6 小结 216
第 12 章 操作符重载 217
12.1 算术与位操作符 218
12.1.1 一元操作符 220
12.1.2 二元操作符 221
12.1.3 复合赋值操作符 221
12.2 相等测试 222
12.3 顺序比较 225
12.4 Index与IndexMut 227
12.5 其他操作符 229
第 13 章 实用特型 230
13.1 Drop 231
13.2 Sized 233
13.3 Clone 235
13.4 Copy 236
13.5 Deref与DerefMut 237
13.6 Default 239
13.7 AsRef与AsMut 241
13.8 Borrow与BorrowMut 242
13.9 From与Into 244
13.10 ToOwned 245
13.11 Borrow与ToOwned实例:谦逊的奶牛(Cow) 246
第 14 章 闭包 248
14.1 捕获变量 249
14.1.1 借用值的闭包 250
14.1.2 盗用值的闭包 250
14.2 函数与闭包类型 252
14.3 闭包的性能 254
14.4 闭包和安全 255
14.4.1 杀值的闭包 255
14.4.2 FnOnce 256
14.4.3 FnMut 257
14.5 回调 259
14.6 有效使用闭包 261
第 15 章 迭代器 263
15.1 Iterator和IntoIterator特型 264
15.2 创建迭代器 265
15.2.1 iter和iter_mut方法 265
15.2.2 IntoIterator实现 266
15.2.3 drain方法 268
15.2.4 其他迭代器源 268
15.3 迭代器适配器 269
15.3.1 map和filter 269
15.3.2 filter_map和flat_map 271
15.3.3 scan 273
15.3.4 take和take_while 274
15.3.5 skip和skip_while 274
15.3.6 peekable 275
15.3.7 fuse 276
15.3.8 可逆迭代器与rev 277
15.3.9 inspect 278
15.3.10 chain 278
15.3.11 enumerate 279
15.3.12 zip 279
15.3.13 by_ref 280
15.3.14 cloned 281
15.3.15 cycle 281
15.4 消费迭代器 282
15.4.1 简单累计:count、sum和product 282
15.4.2 max和min 283
15.4.3 max_by和min_by 283
15.4.4 max_by_key和min_by_key 283
15.4.5 比较项序列 284
15.4.6 any和all 285
15.4.7 position、rposition和ExactSizeIterator 285
15.4.8 fold 285
15.4.9 nth 286
15.4.10 last 286
15.4.11 find 287
15.4.12 构建集合:collect和FromIterator 287
15.4.13 Extend特型 289
15.4.14 partition 289
15.5 实现自己的迭代器 290
第 16 章 集合 294
16.1 概述 295
16.2 Vec 296
16.2.1 访问元素 296
16.2.2 迭代 298
16.2.3 增长和收缩向量 298
16.2.4 连接 300
16.2.5 拆分 301
16.2.6 交换 303
16.2.7 排序和搜索 303
16.2.8 比较切片 304
16.2.9 随机元素 305
16.2.10 Rust排除无效错误 305
16.3 VecDeque 306
16.4 LinkedList 307
16.5 BinaryHeap 308
16.6 HashMap和BTreeMap 309
16.6.1 条目 311
16.6.2 映射迭代 313
16.7 HashSet和BTreeSet 313
16.7.1 集迭代 314
16.7.2 相等的值不相同 314
16.7.3 整集操作 315
16.8 散列 316
16.9 标准集合之外 318
第 17 章 字符串与文本 319
17.1 Unicode背景知识 319
17.1.1 ASCII、Latin-1和Unicode 320
17.1.2 UTF-8 320
17.1.3 文本方向性 322
17.2 字符(char) 322
17.2.1 字符分类 322
17.2.2 处理数字 322
17.2.3 字符大小写转换 323
17.2.4 与整数相互转换 324
17.3 String与str 324
17.3.1 创建字符串值 325
17.3.2 简单检查 325
17.3.3 追加和插入文本 326
17.3.4 删除文本 327
17.3.5 搜索与迭代的约定 327
17.3.6 搜索文本的模式 328
17.3.7 搜索与替换 328
17.3.8 迭代文本 329
17.3.9 修剪 331
17.3.10 字符串大小写转换 331
17.3.11 从字符串解析出其他类型 331
17.3.12 将其他类型转换为字符串 332
17.3.13 作为其他类文本类型借用 333
17.3.14 访问UTF-8格式的文本 333
17.3.15 从UTF-8数据产生文本 334
17.3.16 阻止分配 335
17.3.17 字符串作为泛型集合 336
17.4 格式化值 337
17.4.1 格式化文本值 338
17.4.2 格式化数值 339
17.4.3 格式化其他类型 341
17.4.4 为调试格式化值 341
17.4.5 为调试格式化指针 342
17.4.6 通过索引或名字引用参数 342
17.4.7 动态宽度与精度 343
17.4.8 格式化自定义类型 344
17.4.9 在你的代码中使用格式化语言 345
17.5 正则表达式 346
17.5.1 基本用法 347
17.5.2 懒构建Regex值 348
17.6 规范化 349
17.6.1 规范化形式 350
17.6.2 unicode-normalization包 351
第 18 章 输入和输出 352
18.1 读取器和写入器 353
18.1.1 读取器 354
18.1.2 缓冲读取器 355
18.1.3 读取文本行 356
18.1.4 收集行 358
18.1.5 写入器 359
18.1.6 文件 360
18.1.7 搜寻 360
18.1.8 其他读取器和写入器类型 361
18.1.9 二进制数据、压缩与序列化 362
18.2 文件与目录 364
18.2.1 OsStr和Path 364
18.2.2 Path和PathBuf的方法 365
18.2.3 文件系统访问函数 367
18.2.4 读取目录 368
18.2.5 平台特定的特性 369
18.3 网络编程 370
第 19 章 并发 373
19.1 并行分叉–合并 374
19.1.1 产生及合并 376
19.1.2 跨线程错误处理 377
19.1.3 跨线程共享不可修改数据 378
19.1.4 Rayon 380
19.1.5 重温曼德布洛特集合 382
19.2 通道 383
19.2.1 发送值 385
19.2.2 接收值 387
19.2.3 运行管道 388
19.2.4 通道特性与性能 390
19.2.5 线程安全:Send与Sync 391
19.2.6 将所有迭代器都接到通道上 393
19.2.7 超越管道 394
19.3 共享可修改状态 395
19.3.1 什么是互斥量 395
19.3.2 Mutex 397
19.3.3 mut与Mutex 398
19.3.4 互斥量的问题 399
19.3.5 死锁 399
19.3.6 中毒的互斥量 400
19.3.7 使用互斥量的多消费者通道 400
19.3.8 读/写锁(RwLock) 401
19.3.9 条件变量(Condvar)402
19.3.10 原子类型 403
19.3.11 全局变量 404
19.4 习惯编写Rust并发代码 406
第 20 章 宏 407
20.1 宏基础 408
20.1.1 宏扩展基础 409
20.1.2 意外结果 410
20.1.3 重复 411
20.2 内置宏 413
20.3 调试宏 414
20.4 json!宏 415
20.4.1 片段类型 416
20.4.2 在宏里使用递归 419
20.4.3 在宏里使用特型 419
20.4.4 作用域与自净宏 421
20.4.5 导入和导出宏 424
20.5 匹配时避免语法错误 425
20.6 超越macro_rules! 426
第 21 章 不安全代码 427
21.1 不安全源自哪里 428
21.2 不安全的块 429
21.3 不安全的函数 431
21.4 不安全的块还是不安全的函数 433
21.5 未定义行为 434
21.6 不安全的特型 435
21.7 原始指针 437
21.7.1 安全解引用原始指针 439
21.7.2 示例:RefWithFlag 440
21.7.3 可空指针 442
21.7.4 类型大小与对齐 442
21.7.5 指针算术 443
21.7.6 移入和移出内存 444
21.7.7 示例:GapBuffer 447
21.7.8 不安全代码中的诧异安全性 453
21.8 外来函数:在Rust中调用C和C++ 453
21.8.1 查找共有数据表示 454
21.8.2 声明外来函数和变量 456
21.8.3 使用库函数 458
21.8.4 libgit2的原始接口 461
21.8.5 libgit2的安全接口 466
21.9 小结 475
作者介绍 476
封面介绍 476
^ 收 起
吉姆·布兰迪(Jim Blandy)Mozilla软件工程师,拥有近40年编程经验和30年自由软件开发经验,是Subversion版本控制系统最初的设计者之一。
贾森·奥伦多夫(Jason Orendorff)资深软件工程师,拥有20余年软件开发经验,目前在为Mozilla Firefox Web浏览器开发JavaScript引擎。
【译者介绍】
360前端开发资深专家、前端TC委员、W3C AC代表,任职于“奇舞团”,也是360 Web字体服务“奇字库”作者。
贾森·奥伦多夫(Jason Orendorff)资深软件工程师,拥有20余年软件开发经验,目前在为Mozilla Firefox Web浏览器开发JavaScript引擎。
【译者介绍】
360前端开发资深专家、前端TC委员、W3C AC代表,任职于“奇舞团”,也是360 Web字体服务“奇字库”作者。
本书由两位经验丰富的系统程序员撰写,介绍了一种具有C和C++性能,同时安全且支持并发的新型系统编程语言Rust,解释了Rust如何在性能和安全性之间架起桥梁,以及我们如何用好这门语言。书中主要内容包括:Rust的基本数据类型,关于所有权、引用等概念,表达式、错误处理、包和模块、结构体、枚举与模式等基础知识,Rust语言的特型与泛型,闭包,迭代器,集合,等等。
比价列表
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠