《Rust權威指南》是2020年5月電子工業出版社出版的圖書,作者是毛靖凱,唐剛,沙渺。
基本介紹
- 書名:Rust權威指南
- 作者:毛靖凱,唐剛,沙渺
- 出版社:電子工業出版社
- 出版時間:2020年5月
- 頁數:716 頁
- 定價:159 元
- 開本:16 開
- ISBN:9787121387067
- 字數:716千字
- 版次:01-01
內容簡介,圖書目錄,
內容簡介
本書由Rust核心開發團隊編寫而成,由淺入深地探討了Rust語言的方方面面。從學習函式、選擇數據結構及綁定變數入手,逐步介紹所有權、trait、生命周期、安全保證等高級概念,模式匹配、錯誤處理、包管理、函式式特性、並發機制等實用工具,以及兩個完整的項目開發實戰案例。 作為開源的系統級程式語言,Rust可以幫助你編寫出更為快速且更為可靠的軟體,在給予開發者底層控制能力的同時,通過深思熟慮的工程設計避免了傳統語言帶來的諸多麻煩。 本書被視為Rust開發工作的必讀書目,適合所有希望評估、入門、提高和研究Rust語言的軟體開發人員閱讀。
圖書目錄
目 錄
第1章 入門指南1
安裝1
在Linux或macOS環境中安裝Rust2
在Windows環境中安裝Rust3
更新與卸載4
常見問題4
本地文檔4
Hello, World!5
創建一個資料夾5
編寫並運行一個Rust程式6
對這個程式的剖析7
編譯與運行是兩個不同的步驟8
Hello, Cargo!10
使用Cargo創建一個項目10
使用Cargo構建和運行項目13
以Release模式進行構建15
學會習慣Cargo15
總結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
控制流運算符match140
綁定值的模式142
匹配Option143
匹配必須窮舉所有的可能145
_通配符146
簡單控制流if let146
總結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
可恢復錯誤與Result207
匹配不同的錯誤210
失敗時觸發panic的捷徑:unwrap和expect212
傳播錯誤213
要不要使用panic!219
示例、原型和測試220
當你比編譯器擁有更多信息時220
錯誤處理的指導原則221
創建自定義類型來進行有效性驗證222
總結225
第10章 泛型、trait與生命周期226
通過將代碼提取為函式來減少重複工作227
泛型數據類型230
在函式定義中230
在結構體定義中234
在枚舉定義中236
在方法定義中237
泛型代碼的性能問題239
trait:定義共享行為241
定義trait241
為類型實現trait242
默認實現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檢查panic289
使用Result編寫測試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
使用疊代器代替clone381
使用疊代器適配器讓代碼更加清晰385
比較循環和疊代器的性能386
總結388
第14章 進一步認識Cargo及crates.io390
使用發布配置來定製構建391
將包發布到crates.io上392
編寫有用的文檔注釋393
使用pub use來導出合適的公共API397
創建crates.io賬戶401
為包添加元數據401
發布到crates.io403
發布已有包的新版本404
使用cargo yank命令從cargo.io上移除版本404
Cargo工作空間405
創建工作空間405
在工作空間中創建第二個包407
使用cargo install從crates.io上安裝可執行程式413
使用自定義命令擴展Cargo的功能414
總結414
第15章 智慧型指針415
使用Box在堆上分配數據417
使用Box在堆上存儲數據417
使用裝箱定義遞歸類型418
通過Deref trait將智慧型指針視作常規引用423
使用解引用運算符跳轉到指針指向的值424
把Box當成引用來操作425
定義我們自己的智慧型指針426
通過實現Deref trait來將類型視作引用427
函式和方法的隱式解引用轉換428
解引用轉換與可變性430
藉助Drop trait在清理時運行代碼431
使用std::mem::drop提前丟棄值433
基於引用計數的智慧型指針Rc435
使用Rc共享數據436
克隆Rc會增加引用計數439
RefCell和內部可變性模式440
使用RefCell在運行時檢查借用規則441
內部可變性:可變地借用一個不可變的值442
將Rc和RefCell結合使用來實現一個擁有多重所有權的可變數據450
循環引用會造成記憶體泄漏452
創建循環引用453
使用Weak代替Rc來避免循環引用456
總結463
第16章 無畏並發464
使用執行緒同時運行代碼466
使用spawn創建新執行緒467
使用join句柄等待所有執行緒結束469
線上程中使用move閉包471
使用訊息傳遞線上程間轉移數據475
通道和所有權轉移478
傳送多個值並觀察接收者的等待過程480
通過克隆傳送者創建多個生產者481
共享狀態的並發483
互斥體一次只允許一個執行緒訪問數據484
RefCell/Rc和Mutex/Arc之間的相似性493
使用Sync trait和Send trait對並發進行擴展494
允許執行緒間轉移所有權的Send trait494
允許多執行緒同時訪問的Sync trait495
手動實現Send和Sync是不安全的495
總結495
第17章 Rust的面向對象編程特性497
面向對象語言的特性497
對象包含數據和行為498
封裝實現細節498
作為類型系統和代碼共享機制的繼承500
使用trait對象來存儲不同類型的值502
為共有行為定義一個trait503
實現trait505
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
不安全Rust560
不安全超能力561
解引用裸指針562
調用不安全函式或方法564
訪問或修改一個可變靜態變數570
實現不安全trait572
使用不安全代碼的時機573
高級trait573
在trait的定義中使用關聯類型指定占位類型573
默認泛型參數和運算符重載575
用於消除歧義的完全限定語法:調用相同名稱的方法578
用於在trait中附帶另外一個trait功能的超trait582
使用newtype模式在外部類型上實現外部trait585
高級類型586
使用newtype模式實現類型安全與抽象587
使用類型別名創建同義類型587
永不返回的Never類型590
動態大小類型和Sized trait593
高級函式與閉包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
返回真正的HTML622
驗證請求有效性並選擇性地回響624
少許重構626
把單執行緒伺服器修改為多執行緒伺服器628
在現有的伺服器實現中模擬一個慢請求628
使用執行緒池改進吞吐量629
優雅地停機與清理652
為ThreadPool實現Drop trait652
通知執行緒停止監聽任務655
總結661
附錄A 關鍵字662
當前正在使用的關鍵字662
將來可能會使用的保留關鍵字664
原始標識符665
附錄B 運算符和符號667
運算符667
非運算符符號669
附錄C 可派生trait673
面向程式設計師格式化輸出的Debug674
用於相等性比較的PartialEq和Eq675
使用PartialOrd和Ord進行次序比較675
使用Clone和Copy複製值676
用於將值映射到另外一個長度固定的值的Hash677
用於提供默認值的Default678
附錄D 有用的開發工具679
使用rustfmt自動格式化代碼679
使用rustfix修復代碼680
使用Clippy完成更多的代碼分析681
使用Rust語言伺服器來集成IDE683
附錄E 版本684