第1章 Rust编程语言概述 1
1.1 编程语言 1
1.2 Rust语言 2
1.2.1 为什么选择Rust 2
1.2.2 在哪里能使用Rust 2
1.3 Hello, Rust! 3
第2章 开发环境 4
2.1 工具链 4
2.1.1 Windows系统上的安装 4
2.1.2 在GNU/Linux上安装 6
2.1.3 在其他操作系统上安装 7
2.1.4 卸载 7
2.2 集成开发环境 7
2.3 CLion安装与部署 8
2.3.1 下载和安装CLion 8
2.3.2 配置CLion 9
第3章 开发命令行程序 13
3.1 输出到命令行 13
3.2 详细输出 14
3.3 从命令行输入 15
3.4 从命令参数中获取 16
第4章 基础语法 18
4.1 变量 18
4.2 重影 20
4.3 常量 20
4.4 静态变量 21
第5章 Rust数据类型 23
5.1 整数型 23
5.2 浮点数型 24
5.3 数学运算 24
5.3.1 基础运算 24
5.3.2 数学函数 24
5.4 布尔型 25
5.5 逻辑运算 25
5.6 字符型 26
5.7 字符串 27
5.8 元组 28
5.9 数组 29
第6章 注释 31
6.1 常规注释 31
6.2 说明文档注释 31
6.3 生成工程文档 33
第7章 函数 34
7.1 函数的声明 34
7.2 函数语句与函数表达式 35
7.2.1 函数语句与表达式 35
7.2.2 函数返回值 35
7.2.3 函数表达式 36
7.3 函数对象 37
7.4 闭包(Lambda表达式) 37
第8章 条件语句 39
8.1 if-else 语句 39
8.2 三元运算符 40
8.3 match语句——Rust中的switch 41
第9章 循环结构 43
9.1 while循环 43
9.2 for 循环 44
9.3 loop 循环 45
第10章 所有权 47
10.1 内存管理 47
10.1.1 内存的概念 47
10.1.2 主流的内存管理机制 48
10.2 所有权机制 48
10.2.1 变量范围 49
10.2.2 生命周期 49
10.2.3 转移 50
10.2.4 复制 50
10.2.5 引用和借用 51
10.2.6 垂悬引用 51
10.3 与函数相关的所有权 52
10.3.1 参数所有权 52
10.3.2 返回值所有权 53
10.4 引用类型 54
10.4.1 引用的用途 54
10.4.2 可变引用 55
10.4.3 解引用运算符 56
第11章 切片类型 58
11.1 字符串切片 58
11.2 数组切片 59
第12章 复合类型 60
12.1 结构体 60
12.1.1 结构体的定义 60
12.1.2 结构体的实例化 60
12.1.3 结构体所有权 61
12.1.4 结构体方法 64
12.1.5 元组结构体 66
12.1.6 单元结构体 66
12.2 枚举类 66
12.2.1 枚举类的定义 67
12.2.2 枚举类的match语法 68
12.2.3 if-let语法 69
12.2.4 枚举类的方法 70
第13章 泛型 72
13.1 泛型函数 72
13.2 复合类型的泛型 73
13.2.1 泛型结构体 73
13.2.2 泛型枚举类 74
13.3 impl泛型 75
13.3.1 对泛型类实现方法 75
13.3.2 对具体类实现方法 76
13.3.3 泛型方法 76
第14章 错误处理与空值 78
14.1 错误与错误处理 78
14.2 不可恢复错误 78
14.3 可恢复错误 79
14.3.1 Result枚举类 80
14.3.2 可恢复错误的传递 81
14.3.3 Error类型和它的kind方法 82
14.4 “空引用” 83
14.4.1 Null的概念 84
14.4.2 Option枚举类 84
第15章 工程组织和访问权 86
15.1 工程组织概念 86
15.1.1 箱 86
15.1.2 包 87
15.1.3 模块 87
15.2 访问权 88
15.2.1 模块访问权 88
15.2.2 结构体访问权 89
15.2.3 枚举类访问权 90
15.3 use 关键字 90
15.4 引用标准库 91
15.5 多源文件工程 92
15.5.1 新建源文件 92
15.5.2 运行多源文件程序 92
15.6 Cargo 93
15.6.1 Cargo是什么 93
15.6.2 Cargo功能 93
15.6.3 Cargo导入外部包 94
第16章 特性 96
16.1 定义特性 96
16.2 实现特性 96
16.3 默认特性 98
16.4 特性作参数 99
16.4.1 常规特性参数 99
16.4.2 泛型特性参数 100
16.4.3 特性叠加 101
16.5 特性作返回值 102
16.6 有条件的实现方法 104
第17章 文件与I/O 105
17.1 关于文件的概念 105
17.1.1 文件 105
17.1.2 流 105
17.2 打开文件 106
17.2.1 打开文件的种类 106
17.2.2 只读模式 106
17.3 创建新文件模式 109
17.3.1 创建新文件 109
17.3.2 覆盖文件 110
17.4 追加模式 110
17.5 自定义模式打开文件 111
17.5.1 OpenOptions对象 111
17.5.2 以读写模式打开文件 112
17.6 写入和读取二进制信息 114
17.7 文件系统 115
17.7.1 列出目录 115
17.7.2 创建目录 116
17.7.3 删除文件或目录 116
第18章 数据结构与集合 118
18.1 线性数据结构 118
18.1.1 向量 120
18.1.2 双端向量 124
18.1.3 链表 125
18.2 字符串 125
18.2.1 将数据转换为字符串 126
18.2.2 拼接字符串 127
18.2.3 字符串截取 128
18.2.4 UTF-8编码 129
18.3 映射表 131
18.3.1 散列映射表 131
18.3.2 B树映射表 132
18.4 集 133
18.4.1 散列集 133
18.4.2 B树集 135
18.5 堆 136
18.5.1 二叉堆 136
18.5.2 从向量创建堆 137
第19章 面向对象编程思想的实现 139
19.1 类 139
19.2 对象 141
19.3 封装 142
19.4 继承 143
19.5 多态 145
第20章 堆内存区 147
20.1 内存的分配方式 147
20.2 Box类型 148
20.3 Box解引用特性 150
20.4 dyn关键字 151
20.5 Box的所有权 151
第21章 高级引用 152
21.1 Box引用 152
21.2 Rc——引用计数 152
21.3 Mutex——互斥锁 155
第22章 运算符方法 158
22.1 Rust运算符方法 158
22.2 实现运算符方法 159
22.2.1 实现复数加法 159
22.2.2 引用类型运算符方法实现 160
22.3 支持实现运算符方法的运算符 161
22.4 特殊的运算符 162
22.4.1 Deref和DerefMut特性 162
22.4.2 Drop特性 163
22.4.3 Fn、FnMut和FnOnce特性 164
第23章 无畏并发 168
23.1 并发和问题 168
23.1.1 数据共用 168
23.1.2 数据回收 169
23.1.3 死锁 169
23.1.4 线程通信 169
23.2 多线程 170
23.3 线程通信 171
23.4 Arc线程安全引用计数 173
23.5 应对互斥锁死锁 175
23.5.1 用一个互斥锁保护 177
23.5.2 使用“标志互斥锁” 178
第24章 属性 180
24.1 属性的使用 180
24.2 条件编译属性 181
24.2.1 cfg 属性 181
24.2.2 test条件编译 182
24.2.3 “cfg_attr”属性 183
24.3 derive 派生属性 183
24.4 诊断属性 185
24.4.1 lint检查属性 185
24.4.2 deprecated属性 187
24.4.3 must_use属性 187
24.5 模块路径属性 188
24.6 其他属性 189
第25章 宏 190
25.1 宏的使用 190
25.2 宏的定义 191
25.3 过程宏 193
25.3.1 类函数过程宏 193
25.3.2 派生过程宏 196
25.3.3 属性宏 198
第26章 “不安全”语法 200
26.1 “不安全”域 200
26.2 原始指针 201
26.3 “不安全”的函数和方法 202
26.4 访问静态变量 203
26.5 “不安全”特性 204
26.6 共用体 205
第27章 Web服务器程序 208
27.1 TCP简介 208
27.1.1 建立TCP连接 209
27.1.2 搭建TCP服务器 209
27.2 UDP简介 212
27.3 简易的HTTP服务器 213
IV
V