Rust 程式設計 Programming Rust: Fast, Safe Systems Development

Jim Blandy,Jason Orendorff

  • Rust 程式設計-preview-1
  • Rust 程式設計-preview-2
Rust 程式設計-preview-1

買這商品的人也買了...

商品描述

本書由兩位經驗豐富的系統程序員撰寫,介紹了一種具有C和C++性能,同時安全且支持並發的新型系統編程語言Rust,
解釋了Rust如何在性能和安全性之間架起橋梁,以及我們如何用好這門語言。
書中主要內容包括:Rust的基本數據類型,關於所有權、引用等概念,表達式、錯誤處理、
包和模塊、結構體、枚舉與模式等基礎知識,Rust語言的特型與泛型,閉包,迭代器,集合,等等。

作者簡介

Jim Blandy

Mozilla軟件工程師,擁有近40年編程經驗和30年自由軟件開發經驗,是Subversion版本控制系統最初的設計者之一。

Jason Orendorff

資深軟件工程師,擁有20餘年軟件開發經驗,目前在為Mozilla Firefox Web瀏覽器開發JavaScript引擎。


【譯者介紹】

360前端開發資深專家、前端TC委員、W3C AC代表,任職於“奇舞團”,也是360 Web字體服務“奇字庫”作者。

目錄大綱

前言 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