第1章 新时代的语言 1
1.1缘起 1
1.2设计哲学 3
1.2.1内存安全 3
1.2.2零成本抽象 4
1.2.3实用性 5
1.3现状与未来 7
1.3.1语言架构 8
1.3.2开源社区 9
1.3.3发展前景 9
1.4 Rust代码如何执行 10
1.5小结 10
第2章 语言精要 11
2.1 Rust语言的基本构成 11
2.1.1语言规范 11
2.1.2编译器 12
2.1.3核心库 12
2.1.4标准库 12
2.1.5包管理器 13
2.2语句与表达式 13
2.3变量与绑定 14
2.3.1位置表达式和值表达式 15
2.3.2不可变绑定与可变绑定 15
2.3.3所有权与引用 16
2.4函数与闭包 17
2.4.1函数定义 17
2.4.2作用域与生命周期 18
2.4.3函数指针 19
2.4.5 CTFE机制 20
2.4.6闭包 20
2.5流程控制 22
2.5.1条件表达式 22
2.5.2循环表达式 23
2.5.3 match表达式与模式匹配 24
2.5.4 if let和while let表达式 25
2.6基本数据类型 26
2.6.1布尔类型 26
2.6.2基本数字类型 26
2.6.3字符类型 27
2.6.4数组类型 28
2.6.5范围类型 29
2.6.6切片类型 29
2.6.7 str字符串类型 30
2.6.8原生指针 31
2.6.9 never类型 31
2.7复合数据类型 32
2.7.1元组 32
2.7.2结构体 33
2.7.3枚举体 36
2.8常用集合类型 38
2.8.1线性序列:向量 38
2.8.2线性序列:双端队列 39
2.8.3线性序列:链表 40
2.8.4 Key-Value映射表:HashMap和BTreeMap 40
2.8.5集合:HashSet和BTreeSet 41
2.8.6优先队列:BinaryHeap 42
2.9智能指针 42
2.10泛型和trait 43
2.10.1泛型 43
2.10.2 trait 44
2.11错误处理 47
2.12表达式优先级 48
2.13注释与打印 48
2.14小结 50
第3章 类型系统 51
3.1通用概念 51
3.1.1类型系统的作用 51
3.1.2类型系统的分类 52
3.1.3类型系统与多态性 53
3.2 Rust类型系统概述 53
3.2.1类型大小 53
3.2.2类型推导 58
3.3泛型 60
3.3.1泛型函数 60
3.3.2泛型返回值自动推导 62
3.4深入trait 62
3.4.1接口抽象 63
3.4.2泛型约束 69
3.4.3抽象类型 71
3.4.4标签trait 77
3.5类型转换 83
3.5.1 Deref解引用 83
3.5.2 as操作符 86
3.5.3 From和Into 88
3.6当前trait系统的不足 89
3.6.1孤儿规则的局限性 90
3.6.2代码复用的效率不高 91
3.6.3抽象表达能力有待改进 93
3.7小结 94
第4章 内存管理 95
4.1通用概念 95
4.1.1栈 96
4.1.2堆 99
4.1.3内存布局 101
4.2 Rust中的资源管理 103
4.2.1变量和函数 103
4.2.2智能指针与RAII 106
4.2.3内存泄漏与内存安全 110
4.2.4复合类型的内存分配和布局 115
4.3小结 117
第5章 所有权系统 119
5.1通用概念 120
5.2所有权机制 123
5.3绑定、作用域和生命周期 125
5.3.1不可变与可变 126
5.3.2绑定的时间属性——生命周期 127
5.4所有权借用 131
5.5生命周期参数 135
5.5.1显式生命周期参数 136
5.5.2省略生命周期参数 143
5.5.3生命周期限定 145
5.5.4 trait对象的生命周期 145
5.6智能指针与所有权 146
5.6.1共享所有权Rc<T>和Weak<T> 149
5.6.2内部可变性Cell<T>和RefCell<T> 151
5.6.3写时复制Cow<T> 153
5.7并发安全与所有权 156
5.8非词法作用域生命周期 157
5.9小结 161
第6章 函数、闭包与迭代器 162
6.1函数 162
6.1.1函数屏蔽 164
6.1.2函数参数模式匹配 164
6.1.3函数返回值 165
6.1.4泛型函数 166
6.1.5方法与函数 167
6.1.6高阶函数 168
6.2闭包 171
6.2.1闭包的基本语法 172
6.2.2闭包的实现 173
6.2.3闭包与所有权 178
6.2.4闭包作为函数参数和返回值 184
6.2.5高阶生命周期 190
6.3迭代器 194
6.3.1外部迭代器和内部迭代器 194
6.3.2 Iterator trait 195
6.3.3 IntoIterator trait和迭代器 199
6.3.4迭代器适配器 202
6.3.5消费器 207
6.3.6自定义迭代器适配器 211
6.4小结 214
第7章 结构化编程 216
7.1面向对象风格编程 217
7.1.1结构体 217
7.1.2枚举体 225
7.1.3析构顺序 230
7.2常用设计模式 233
7.2.1建造者模式 234
7.2.2访问者模式 236
7.2.3 RAII模式 239
7.3小结 243
第8章 字符串与集合类型 244
8.1字符串 244
8.1.1字符编码 244
8.1.2字符 247
8.1.3字符串分类 249
8.1.4字符串的两种处理方式 251
8.1.5字符串的修改 253
8.1.6字符串的查找 256
8.1.7与其他类型相互转换 265
8.1.8回顾 270
8.2集合类型 271
8.2.1动态可增长数组 271
8.2.2映射集 281
8.3理解容量 289
8.4小结 292
第9章 构建健壮的程序 294
9.1通用概念 294
9.2消除失败 295
9.3分层处理错误 297
9.3.1可选值 Option<T> 298
9.3.2错误处理Result<T,E> 302
9.4恐慌(Panic) 314
9.5第三方库 316
9.6小结 319
第10章 模块化编程 320
10.1包管理 321
10.1.1使用Cargo创建包 321
10.1.2使用第三方包 323
10.1.3 Cargo.toml文件格式 331
10.1.4自定义Cargo 337
10.2模块系统 339
10.3从零开始实现一个完整功能包 344
10.3.1使用Cargo创建新项目 345
10.3.2使用structopt解析命令行参数 345
10.3.3定义统一的错误类型 347
10.3.4读取CSV文件 348
10.3.5替换CSV文件中的内容 351
10.3.6进一步完善包 353
10.4可见性和私有性 358
10.5小结 360
第11章 安全并发 362
11.1通用概念 362
11.1.1多进程和多线程 363
11.1.2事件驱动、异步回调和协程 364
11.1.3线程安全 365
11.2多线程并发编程 370
11.2.1线程管理 371
11.2.2 Send和Sync 375
11.2.3使用锁进行线程同步 379
11.2.4屏障和条件变量 384
11.2.5原子类型 386
11.2.6使用Channel进行线程间通信 388
11.2.7内部可变性探究 397
11.2.8线程池 399
11.2.9使用Rayon执行并行任务 407
11.2.10使用Crossbeam 409
11.3异步并发 412
11.3.1生成器 413
11.3.2 Future并发模式 418
11.3.3 async/await 421
11.4数据并行 428
11.4.1什么是SIMD 429
11.4.2在Rust中使用SIMD 430
11.5小结 434
第12章 元编程 435
12.1反射 436
12.1.1通过is函数判断类型 436
12.1.2转换到具体类型 437
12.1.3非静态生命周期类型 439
12.2宏系统 440
12.2.1起源 440
12.2.2 Rust中宏的种类 441
12.2.3编译过程 442
12.2.4声明宏 445
12.2.5过程宏 458
12.3编译器插件 472
12.4小结 475
第13章 超越安全的边界 477
13.1 Unsafe Rust介绍 477
13.1.1 Unsafe语法 478
13.1.2访问和修改可变静态变量 480
13.1.3 Union联合体 480
13.1.4解引用原生指针 483
13.2基于Unsafe进行安全抽象 484
13.2.1原生指针 484
13.2.2子类型与型变 489
13.2.3未绑定生命周期 494
13.2.4 Drop检查 495
13.2.5 NonNull<T>指针 505
13.2.6 Unsafe与恐慌安全 508
13.2.7堆内存分配 508
13.2.8混合代码内存安全架构三大原则 510
13.3和其他语言交互 510
13.3.1外部函数接口 510
13.3.2与C/C++语言交互 514
13.3.3使用Rust提升动态语言性能 528
13.4 Rust与WebAssembly 532
13.4.1 WebAssembly要点介绍 533
13.4.2使用Rust开发WebAssembly 539
13.4.3打造WebAssembly开发生态 541
13.5小结 543
附录A Rust开发环境指南 544
附录B Rust如何调试代码 549