前言
第一部分 基礎知識
第1章 與君初相見 2
1.1 版本和發布策略 2
1.2 安裝開發環境 4
1.3 Hello World 7
1.4 Prelude 8
1.5 Format格式詳細說明 8
第2章 變量和類型 10
2.1 變量聲明 10
2.1.1 變量遮蔽 12
2.1.2 類型推導 13
2.1.3 類型彆名 14
2.1.4 靜態變量 15
2.1.5 常量 16
2.2 基本數據類型 16
2.2.1 bool 16
2.2.2 char 17
2.2.3 整數類型 17
2.2.4 整數溢齣 19
2.2.5 浮點類型 21
2.2.6 指針類型 23
2.2.7 類型轉換 23
2.3 復閤數據類型 24
2.3.1 tuple 25
2.3.2 struct 25
2.3.3 tuple struct 27
2.3.4 enum 29
2.3.5 類型遞歸定義 32
第3章 語句和錶達式 34
3.1 語句 34
3.2 錶達式 34
3.2.1 運算錶達式 35
3.2.2 賦值錶達式 37
3.2.3 語句塊錶達式 38
3.3 if-else 39
3.3.1 loop 40
3.3.2 while 41
3.3.3 for循環 42
第4章 函數 44
4.1 簡介 44
4.2 發散函數 46
4.3 main函數 47
4.4 const fn 48
4.5 函數遞歸調用 49
第5章 trait 50
5.1 成員方法 50
5.2 靜態方法 53
5.3 擴展方法 55
5.4 完整函數調用語法 56
5.5 trait約束和繼承 58
5.6 Derive 59
5.7 trait彆名 60
5.8 標準庫中常見的trait簡介 61
5.8.1 Display和Debug 61
5.8.2 PartialOrd / Ord /
PartialEq / Eq 62
5.8.3 Sized 63
5.8.4 Default 64
5.9 總結 65
第6章 數組和字符串 66
6.1 數組 66
6.1.1 內置方法 67
6.1.2 多維數組 67
6.1.3 數組切片 67
6.1.4 DST和胖指針 68
6.1.5 Range 70
6.1.6 邊界檢查 72
6.2 字符串 74
6.2.1 &str 74
6.2.2 String 75
第7章 模式解構 77
7.1 簡介 77
7.2 match 78
7.2.1 exhaustive 79
7.2.2 下劃綫 80
7.2.3 match也是錶達式 82
7.2.4 Guards 83
7.2.5 變量綁定 84
7.2.6 ref和mut 85
7.3 if-let和while-let 88
7.4 函數和閉包參數做模式解構 89
7.5 總結 90
第8章 深入類型係統 91
8.1 代數類型係統 91
8.2 Never Type 94
8.3 再談Option類型 97
第9章 宏 102
9.1 簡介macro 102
9.1.1 實現編譯階段檢查 102
9.1.2 實現編譯期計算 103
9.1.3 實現自動代碼生成 103
9.1.4 實現語法擴展 103
9.2 示範型宏 103
9.3 宏1.1 105
第二部分 內存安全
第10章 內存管理基礎 110
10.1 堆和棧 110
10.2 段錯誤 111
10.3 內存安全 112
第11章 所有權和移動語義 114
11.1 什麼是所有權 114
11.2 移動語義 116
11.3 復製語義 118
11.4 Box類型 120
11.5 Clone VS. Copy 121
11.5.1 Copy的含義 121
11.5.2 Copy 的實現條件 121
11.5.3 Clone的含義 122
11.5.4 自動derive 123
11.5.5 總結 123
11.6 析構函數 124
11.6.1 資源管理 125
11.6.2 主動析構 126
11.6.3 Drop VS. Copy 129
11.6.4 析構標記 129
第12章 藉用和生命周期 132
12.1 生命周期 132
12.2 藉用 132
12.3 藉用規則 134
12.4 生命周期標記 136
12.4.1 函數的生命周期標記 136
12.4.2 類型的生命周期標記 138
12.5 省略生命周期標記 139
第13章 藉用檢查 141
13.1 編譯錯誤示例 142
13.2 內存不安全示例:修改枚舉 143
13.3 內存不安全示例:迭代器
失效 144
13.4 內存不安全示例:懸空指針 146
13.5 小結 148
第14章 NLL(Non-Lexical-
Lifetime) 150
14.1 NLL希望解決的問題 150
14.2 NLL的原理 154
14.3 小結 157
第15章 內部可變性 158
15.1 Cell 158
15.2 RefCell 161
15.3 UnsafeCell 164
第16章 解引用 169
16.1 自定義解引用 169
16.2 自動解引用 171
16.3 自動解引用的用處 171
16.4 有時候需要手動處理 173
16.5 智能指針 175
16.5.1 引用計數 175
16.5.2 Cow 178
16.6 小結 180
第17章 泄漏 181
17.1 內存泄漏 181
17.2 內存泄漏屬於內存安全 184
17.3 析構函數泄漏 185
第18章 Panic 190
18.1 什麼是panic 190
18.2 Panic實現機製 191
18.3 Panic Safety 192
18.4 小結 197
第19章 Unsafe 198
19.1 unsafe關鍵字 198
19.2 裸指針 199
19.3 內置函數 201
19.3.1 transmute 201
19.3.2 內存讀寫 202
19.3.3 綜閤示例 204
19.4 分割藉用 206
19.5 協變 209
19.5.1 什麼是協變 209
19.5.2 PhantomData 211
19.6 未定義行為 214
19.7 小結 215
第20章 Vec源碼分析 216
20.1 內存申請 217
20.2 內存擴容 220
20.3 內存釋放 222
20.3.1 Vec的析構函數 222
20.3.2 Drop Check 223
20.4 不安全的邊界 226
20.5 自定義解引用 227
20.6 迭代器 228
20.7 panic safety 231
第三部分 高級抽象
第21章 泛型 234
21.1 數據結構中的泛型 234
21.2 函數中的泛型 235
21.3 impl塊中的泛型 237
21.4 泛型參數約束 237
21.5 關聯類型 241
21.6 何時使用關聯類型 244
21.7 泛型特化 246
21.7.1 特化的意義 247
21.7.2 default上下文關鍵字 248
21.7.3 交叉 impl 250
第22章 閉包 252
22.1 變量捕獲 254
22.2 move關鍵字 256
22.3 Fn/FnMut/FnOnce 257
22.4 閉包與泛型 259
22.5 閉包與生命周期 261
第23章 動態分派和靜態分派 264
23.1 trait object 265
23.2 object safe 268
23.3 impl trait 271
第24章 容器與迭代器 275
24.1 容器 275
24.1.1 Vec 275
24.1.2 VecDeque 277
24.1.3 HashMap 277
24.1.4 BTreeMap 281
24.2 迭代器 283
24.2.1 實現迭代器 283
24.2.2 迭代器的組閤 284
24.2.3 for循環 285
第25章 生成器 289
25.1 簡介 289
25.2 對比迭代器 291
25.3 對比立即求值 292
25.4 生成器的原理 293
25.4.1 生成器原理簡介 293
25.4.2 自引用類型 297
25.5 協程簡介 298
第26章 標準庫簡介 302
26.1 類型轉換 302
26.1.1 AsRef / AsMut 302
26.1.2 Borrow / BorrowMut 303
26.1.3 From / Into 304
26.1.4 ToOwned 305
26.1.5 ToString / FromStr 305
26.2 運算符重載 306
26.3 I/O 308
26.3.1 平颱相關字符串 308
26.3.2 文件和路徑 309
26.3.3 標準輸入輸齣 310
26.3.4 進程啓動參數 311
26.4 Any 311
第四部分 綫程安全
第27章 綫程安全 314
27.1 什麼是綫程 314
27.2 啓動綫程 316
27.3 免數據競爭 317
27.4 Send & Sync 320
第28章 詳解Send和Sync 321
28.1 什麼是Send 321
28.2 什麼是Sync 322
28.3 自動推理 323
28.4 小結 324
第29章 狀態共享 325
29.1 Arc 325
29.2 Mutex 326
29.3 RwLock 328
29.4 Atomic 329
29.5 死鎖 331
29.6 Barrier 333
29.7 Condvar 334
29.8 全局變量 335
29.9 綫程局部存儲 336
29.10 總結 337
第30章 管道 339
30.1 異步管道 339
30.2 同步管道 341
第31章 第三方並行開發庫 343
31.1 threadpool 343
31.2 scoped-threadpool 344
31.3 parking_lot 345
31.4 crossbeam 345
31.5 rayon 346
第五部分 實用設施
第32章 項目和模塊 350
32.1 cargo 350
32.2 項目依賴 353
32.2.1 配置 355
32.2.2 workspace 355
32.2.3 build.rs 356
32.3 模塊管理 358
32.3.1 文件組織 358
32.3.2 可見性 360
32.3.3 use關鍵字 362
第33章 錯誤處理 364
33.1 基本錯誤處理 364
33.2 組閤錯誤類型 366
33.3 問號運算符 367
33.4 main函數中使用問號運算符 372
33.5 新的Failure庫 373
第34章 FFI 375
34.1 什麼是FFI 375
34.2 從C調用Rust庫 376
34.3 從Rust調用C庫 378
34.4 更復雜的數據類型 378
第35章 文檔和測試 381
35.1 文檔 381
35.2 測試 382
附錄 詞匯錶 387
· · · · · · (
收起)
本書詳細描述瞭Rust語言的基本語法,穿插講解一部分高級使用技巧,並以更容易理解的方式解釋其背後的設計思想。全書總共分五個部分。
第一部分介紹Rust基本語法,因為對任何程序設計語言來說,語法都是基礎,學習這部分是理解其他部分的前提。
第二部分介紹屬於Rust獨一無二的內存管理方式。它設計瞭一組全新的機製,既保證瞭安全性,又保持瞭強大的內存布局控製力,而且沒有額外性能損失。這部分是本書的重點和核心所在,也是Rust語言的思想內核精髓之處。
第三部分介紹Rust的抽象錶達能力。它支持多種編程範式,以及較為強大的抽象錶達能力。
第四部分介紹並發模型。在目前這個階段,對並行編程的支持是新一代編程語言不可繞過的重要話題。Rust也吸收瞭業界最新的發展成果,對並發有良好支持。
第五部分介紹一些實用設施。Rust語言有許多創新,但它絕不是高高在上孤芳自賞的類型,設計者在設計過程中充分考慮瞭語言的工程實用性。眾多在其他語言中被證明過的優秀實踐被吸收瞭進來,有利於提升實際工作效率。
通過此書,讀者能夠深入透徹地理解Rust的高階特性,比如代數類型係統、生命周期、藉用檢查、內部可變性、綫程安全、泛型、閉包、迭代器、生成器等。可作為參考書供學生、軟件工程師、研究人員以及其他對Rust語言感興趣的讀者參考。本書所揭示的Rust編程語言的設計思想對於理解其他係統編程語言,如C++,也非常有幫助。