目 錄
第1章 入門指南 1
安裝 1
在Linux或macOS環境中安裝Rust 2
在Windows環境中安裝Rust 3
更新與卸載 4
常見問題 4
本地文檔 4
Hello, World! 5
創建一個文件夾 5
編寫並運行一個Rust程序 6
對這個程序的剖析 7
編譯與運行是兩個不同的步驟 8
Hello, Cargo! 10
使用Cargo創建一個項目 10
使用Cargo構建和運行項目 13
以Release模式進行構建 15
學會習慣Cargo 15
總結 16
第2章 編寫一個猜數遊戲 17
創建一個新的項目 18
處理一次猜測 19
使用變量來存儲值 20
使用Result類型來處理可能失敗的情況 22
通過println!中的占位符輸齣對應的值 24
嘗試運行代碼 24
生成一個保密數字 25
藉助包來獲得更多功能 25
生成一個隨機數 28
比較猜測數字與保密數字 31
使用循環來實現多次猜測 35
在猜測成功時優雅地退齣 37
處理非法輸入 38
總結 40
第3章 通用編程概念 42
變量與可變性 43
變量與常量之間的不同 46
隱藏 47
數據類型 48
標量類型 49
復閤類型 54
函數 58
函數參數 60
函數體中的語句和錶達式 61
函數的返迴值 63
注釋 66
控製流 67
if錶達式 67
使用循環重復執行代碼 72
總結 78
第4章 認識所有權 79
什麼是所有權 79
所有權規則 82
變量作用域 82
String類型 83
內存與分配 84
所有權與函數 91
返迴值與作用域 92
引用與藉用 94
可變引用 96
懸垂引用 99
引用的規則 101
切片 101
字符串切片 104
其他類型的切片 109
總結 109
第5章 使用結構體來組織相關聯的數據 111
定義並實例化結構體 112
在變量名與字段名相同時使用簡化版的字段初始化方法 114
使用結構體更新語法根據其他實例創建新實例 114
使用不需要對字段命名的元組結構體來創建不同的類型 115
沒有任何字段的空結構體 116
一個使用結構體的示例程序 118
使用元組來重構代碼 119
使用結構體來重構代碼:增加有意義的描述信息 120
通過派生trait增加實用功能 121
方法 124
定義方法 124
帶有更多參數的方法 127
關聯函數 128
多個impl塊 129
總結 129
第6章 枚舉與模式匹配 130
定義枚舉 131
枚舉值 131
Option枚舉及其在空值處理方麵的優勢 136
控製流運算符match 140
綁定值的模式 142
匹配Option<T> 143
匹配必須窮舉所有的可能 145
_通配符 146
簡單控製流if let 146
總結 148
第7章 使用包、單元包及模塊來管理日漸復雜的項目 150
包與單元包 152
通過定義模塊來控製作用域及私有性 153
用於在模塊樹中指明條目的路徑 156
使用pub關鍵字來暴露路徑 159
使用super關鍵字開始構造相對路徑 161
將結構體或枚舉聲明為公共的 162
用use關鍵字將路徑導入作用域 165
創建use路徑時的慣用模式 166
使用as關鍵字來提供新的名稱 168
使用pub use重導齣名稱 169
使用外部包 170
使用嵌套的路徑來清理眾多use語句 171
通配符 172
將模塊拆分為不同的文件 172
總結 174
第8章 通用集閤類型 175
使用動態數組存儲多個值 176
創建動態數組 176
更新動態數組 177
銷毀動態數組時也會銷毀其中的元素 177
讀取動態數組中的元素 178
遍曆動態數組中的值 181
使用枚舉來存儲多個類型的值 181
使用字符串存儲UTF-8編碼的文本 183
字符串是什麼 183
創建一個新的字符串 184
更新字符串 185
字符串索引 188
字符串切片 191
遍曆字符串的方法 192
字符串的確沒那麼簡單 193
在哈希映射中存儲鍵值對 193
創建一個新的哈希映射 194
哈希映射與所有權 195
訪問哈希映射中的值 196
更新哈希映射 197
哈希函數 199
總結 200
第9章 錯誤處理 201
不可恢復錯誤與panic! 202
使用panic!産生的迴溯信息 203
可恢復錯誤與Result 207
匹配不同的錯誤 210
失敗時觸發panic的快捷方式:unwrap和expect 212
傳播錯誤 213
要不要使用panic! 219
示例、原型和測試 220
當你比編譯器擁有更多信息時 220
錯誤處理的指導原則 221
創建自定義類型來進行有效性驗證 222
總結 225
第10章 泛型、trait與生命周期 226
通過將代碼提取為函數來減少重復工作 227
泛型數據類型 230
在函數定義中 230
在結構體定義中 234
在枚舉定義中 236
在方法定義中 237
泛型代碼的性能問題 239
trait:定義共享行為 241
定義trait 241
為類型實現trait 242
默認實現 245
使用trait作為參數 247
返迴實現瞭trait的類型 249
使用trait約束來修復largest函數 251
使用trait約束來有條件地實現方法 254
使用生命周期保證引用的有效性 256
使用生命周期來避免懸垂引用 256
藉用檢查器 257
函數中的泛型生命周期 259
生命周期標注語法 260
函數簽名中的生命周期標注 261
深入理解生命周期 264
結構體定義中的生命周期標注 266
生命周期省略 267
方法定義中的生命周期標注 270
靜態生命周期 271
同時使用泛型參數、trait約束與生命周期 272
總結 273
第11章 編寫自動化測試 274
如何編寫測試 275
測試函數的構成 275
使用assert!宏檢查結果 280
使用assert_eq!宏和assert_ne!宏判斷相等性 284
添加自定義的錯誤提示信息 287
使用should_panic檢查panic 289
使用Result<T, E>編寫測試 294
控製測試的運行方式 295
並行或串行地進行測試 296
顯示函數輸齣 296
隻運行部分特定名稱的測試 299
通過顯式指定來忽略某些測試 301
測試的組織結構 303
單元測試 303
集成測試 305
總結 311
第12章 I/O項目:編寫一個命令行程序 312
接收命令行參數 313
讀取參數值 314
將參數值存入變量 316
讀取文件 317
重構代碼以增強模塊化程度和錯誤處理能力 319
二進製項目的關注點分離 320
修復錯誤處理邏輯 325
從main中分離邏輯 330
將代碼分離為獨立的代碼包 333
使用測試驅動開發來編寫庫功能 335
編寫一個會失敗的測試 336
編寫可以通過測試的代碼 339
處理環境變量 343
為不區分大小寫的search函數編寫一個會失敗的測試 343
實現search_case_insensitive函數 345
將錯誤提示信息打印到標準錯誤而不是標準輸齣 349
確認錯誤被寫到瞭哪裏 350
將錯誤提示信息打印到標準錯誤 351
總結 352
第13章 函數式語言特性:迭代器與閉包 353
閉包:能夠捕獲環境的匿名函數 354
使用閉包來創建抽象化的程序行為 354
閉包的類型推斷和類型標注 361
使用泛型參數和Fn trait來存儲閉包 363
Cacher實現的局限性 367
使用閉包捕獲上下文環境 368
使用迭代器處理元素序列 371
Iterator trait和next方法 373
消耗迭代器的方法 374
生成其他迭代器的方法 375
使用閉包捕獲環境 376
使用Iterator trait來創建自定義迭代器 378
改進I/O項目 381
使用迭代器代替clone 381
使用迭代器適配器讓代碼更加清晰 385
比較循環和迭代器的性能 386
總結 388
第14章 進一步認識Cargo及crates.io 390
使用發布配置來定製構建 391
將包發布到crates.io上 392
編寫有用的文檔注釋 393
使用pub use來導齣閤適的公共API 397
創建crates.io賬戶 401
為包添加元數據 401
發布到crates.io 403
發布已有包的新版本 404
使用cargo yank命令從cargo.io上移除版本 404
Cargo工作空間 405
創建工作空間 405
在工作空間中創建第二個包 407
使用cargo install從crates.io上安裝可執行程序 413
使用自定義命令擴展Cargo的功能 414
總結 414
第15章 智能指針 415
使用Box<T>在堆上分配數據 417
使用Box<T>在堆上存儲數據 417
使用裝箱定義遞歸類型 418
通過Deref trait將智能指針視作常規引用 423
使用解引用運算符跳轉到指針指嚮的值 424
把Box<T>當成引用來操作 425
定義我們自己的智能指針 426
通過實現Deref trait來將類型視作引用 427
函數和方法的隱式解引用轉換 428
解引用轉換與可變性 430
藉助Drop trait在清理時運行代碼 431
使用std::mem::drop提前丟棄值 433
基於引用計數的智能指針Rc<T> 435
使用Rc<T>共享數據 436
剋隆Rc<T>會增加引用計數 439
RefCell<T>和內部可變性模式 440
使用RefCell<T>在運行時檢查藉用規則 441
內部可變性:可變地藉用一個不可變的值 442
將Rc<T>和RefCell<T>結閤使用來實現一個擁有多重所有權的可變數據 450
循環引用會造成內存泄漏 452
創建循環引用 453
使用Weak<T>代替Rc<T>來避免循環引用 456
總結 463
第16章 無畏並發 464
使用綫程同時運行代碼 466
使用spawn創建新綫程 467
使用join句柄等待所有綫程結束 469
在綫程中使用move閉包 471
使用消息傳遞在綫程間轉移數據 475
通道和所有權轉移 478
發送多個值並觀察接收者的等待過程 480
通過剋隆發送者創建多個生産者 481
共享狀態的並發 483
互斥體一次隻允許一個綫程訪問數據 484
RefCell<T>/Rc<T>和Mutex<T>/Arc<T>之間的相似性 493
使用Sync trait和Send trait對並發進行擴展 494
允許綫程間轉移所有權的Send trait 494
允許多綫程同時訪問的Sync trait 495
手動實現Send和Sync是不安全的 495
總結 495
第17章 Rust的麵嚮對象編程特性 497
麵嚮對象語言的特性 497
對象包含數據和行為 498
封裝實現細節 498
作為類型係統和代碼共享機製的繼承 500
使用trait對象來存儲不同類型的值 502
為共有行為定義一個trait 503
實現trait 505
trait對象會執行動態派發 509
trait對象必須保證對象安全 510
實現一種麵嚮對象的設計模式 511
定義Post並新建一個處於草稿狀態下的新實例 513
存儲文章內容的文本 514
確保草稿的可讀內容為空 515
請求審批文章並改變其狀態 516
添加approve方法來改變content的行為 518
狀態模式的權衡取捨 521
總結 527
第18章 模式匹配 529
所有可以使用模式的場閤 530
match分支 530
if let條件錶達式 531
while let條件循環 533
for循環 533
let語句 534
函數的參數 536
可失敗性:模式是否會匹配失敗 537
模式語法 539
匹配字麵量 539
匹配命名變量 540
多重模式 541
使用...來匹配值區間 542
使用解構來分解值 543
忽略模式中的值 548
使用匹配守衛添加額外條件 554
@綁定 556
總結 557
第19章 高級特性 559
不安全Rust 560
不安全超能力 561
解引用裸指針 562
調用不安全函數或方法 564
訪問或修改一個可變靜態變量 570
實現不安全trait 572
使用不安全代碼的時機 573
高級trait 573
在trait的定義中使用關聯類型指定占位類型 573
默認泛型參數和運算符重載 575
用於消除歧義的完全限定語法:調用相同名稱的方法 578
用於在trait中附帶另外一個trait功能的超trait 582
使用newtype模式在外部類型上實現外部trait 585
高級類型 586
使用newtype模式實現類型安全與抽象 587
使用類型彆名創建同義類型 587
永不返迴的Never類型 590
動態大小類型和Sized trait 593
高級函數與閉包 595
函數指針 595
返迴閉包 598
宏 599
宏與函數之間的差彆 599
用於通用元編程的macro_rules!聲明宏 600
基於屬性創建代碼的過程宏 603
如何編寫一個自定義derive宏 604
屬性宏 611
函數宏 611
總結 612
第20章 最後的項目:構建多綫程Web服務器 613
構建單綫程Web服務器 614
監聽TCP連接 615
讀取請求 617
仔細觀察HTTP請求 620
編寫響應 621
返迴真正的HTML 622
驗證請求有效性並選擇性地響應 624
少許重構 626
把單綫程服務器修改為多綫程服務器 628
在現有的服務器實現中模擬一個慢請求 628
使用綫程池改進吞吐量 629
優雅地停機與清理 652
為ThreadPool實現Drop trait 652
通知綫程停止監聽任務 655
總結 661
附錄A 關鍵字 662
當前正在使用的關鍵字 662
將來可能會使用的保留關鍵字 664
原始標識符 665
附錄B 運算符和符號 667
運算符 667
非運算符符號 669
附錄C 可派生trait 673
麵嚮程序員格式化輸齣的Debug 674
用於相等性比較的PartialEq和Eq 675
使用PartialOrd和Ord進行次序比較 675
使用Clone和Copy復製值 676
用於將值映射到另外一個長度固定的值的Hash 677
用於提供默認值的Default 678
附錄D 有用的開發工具 679
使用rustfmt自動格式化代碼 679
使用rustfix修復代碼 680
使用Clippy完成更多的代碼分析 681
使用Rust語言服務器來集成IDE 683
附錄E 版本 684
· · · · · · (
收起)