Rust權威指南
作 者: (美)史蒂夫·克拉伯尼克(Steve Klabnik),(美)卡羅爾·尼科爾斯(Carol Nichols) 著 毛靖凱,唐剛,沙渺 譯
定 價: 159
出?版?社: 電子工業出版社
出版日期: 2020年06月01日
頁 數: 686
裝 幀: 平裝
ISBN: 9787121387067
●章入門指南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
匹配Option<T>143
匹配必須窮舉所有的可能145
_通配符146
簡單控制流iflet146
總結148
第7章使用包及模塊來管理日漸復雜的項目150
包152
通過定義模塊來控制作用域及私有性153
用於在模塊樹中指明條目的路徑156
使用pub關鍵字來暴露路徑159
使用super關鍵字開始構造相對路徑161
將結構體或枚舉聲明為公共的162
用use關鍵字將路徑導入作用域165
創建use路徑時的慣用模式166
使用as關鍵字來提供新的名稱168
使用pubuse重導出名稱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
0章泛型、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
1章編寫自動化測試274
如何編寫測試275
測試函數的構成275
使用assert!宏檢查結果280
使用assert_eq!宏和assert_ne!宏判斷相等性284
添加自定義的錯誤提示信息287
使用should_panic檢查panic289
使用Result<T,E>編寫測試294
控制測試的運行方式295
並行或串行地進行測試296
顯示函數輸出296
隻運行部分特定名稱的測試299
通過顯式指定來忽略某些測試301
測試的組織結構303
集成測試305
總結311
2章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
3章函數式語言特性:迭代器與閉包353
閉包:能夠捕獲環境的匿名函數354
使用閉包來創建抽像化的程序行為354
閉包的類型推斷和類型標注361
使用泛型參數和Fntrait來存儲閉包363
Cacher實現的局限性367
使用閉包捕獲上下文環境368
使用迭代素序列371
Iteratortrait和next方法373
消耗迭代器的方法374
生成其他迭代器的方法375
使用閉包捕獲環境376
使用Iteratortrait來創建自定義迭代器378
改進I/O項目381
使用迭代器代替clone381
使用迭代器適配器讓代碼更加清晰385
比較循環和迭代器的性能386
總結388
4章進一步認識Cargo及crates.io390
使用發布配置來定制構建391
將包發布到crates.io上392
編寫有用的文檔注釋393
使用pubuse來導出合適的公共API397
創建crates.io賬戶401
為數據401
發布到crates.io403
發布已有包的新版本404
使用cargoyank命令從cargo.io上移除版本404
Cargo工作空間405
創建工作空間405
在工作空間中創建第二個包407
使用cargoinstall從crates.io上安裝可執行程序413
使用自定義命令擴展Cargo的功能414
總結414
5章智能指針415
使用Box<T>在堆上分配數據417
使用Box<T>在堆上存儲數據417
使用裝箱定義遞歸類型418
通過Dereftrait將智能指針視作常規引用423
使用解引用運算符跳轉到指針指向的值424
把Box<T>當成引用來操作425
定義我們自己的智能指針426
通過實現Dereftrait來將類型視作引用427
函數和方法的隱式解引用轉換428
解引用轉換與可變性430
借助Droptrait在清理時運行代碼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
6章無畏並發464
使用線程同時運行代碼466
使用spawn創建新線程467
使用join句柄等待所有線程結束469
在線程中使用move閉包471
使用消息傳遞在線程間轉移數據475
通道和所有權轉移478
發送多個值並觀察接收者的等待過程480
通過克隆發送者創建多個生產者481
共享狀態的並發483
互斥體一次隻允許一個線程訪問數據484
RefCell<T>/Rc<T>和Mutex<T>/Arc<T>之間的相似性493
使用Synctrait和Sendtrait對並發進行擴展494
允許線程間轉移所有權的Sendtrait494
允許多線程同時訪問的Synctrait495
手動實現Send和Sync是不安全的495
總結495
7章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
8章模式匹配529
所有可以使用模式的場合530
match分支530
iflet條件表達式531
whilelet條件循環533
for循環533
let語句534
函數的參數536
可失敗性:模式是否會匹配失敗537
模式語法539
匹配字面量539
匹配命名變量540
多重模式541
使用...來匹配值區間542
使用解構來分解值543
忽略模式中的值548
使用匹配守衛添加額外條件554
@綁定556
總結557
9章不錯特性559
不安全Rust560
不安全超能力561
解引用裸指針562
調用不安全函數或方法564
訪問或修改一個可變靜態變量570
實現不安全trait572
使用不安全代碼的時機573
不錯trait573
在trait的定義中使用關聯類型指定占位類型573
默認泛型參數和運算符重載575
用於消除歧義的完全限定語法:調用相同名稱的方法578
用於在trait中附帶另外一個trait功能的超trait582
使用newtype模式在外部類型上實現外部trait585
不錯類型586
使用newtype模式實現類型安全與抽像587
使用類型別名創建同義類型587
永不返回的Never類型590
動態大小類型和Sizedtrait593
不錯函數與閉包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實現Droptrait652
通知線程停止監聽任務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
內容簡介
本書由Rust核心開發團隊編寫而成,由淺入深地探討了Rust語言的方方面面。從學習函數、選擇數據結構及綁定變量入手,逐步介紹所有權、trait、生命周期、安全保證等不錯概念,模式匹配、錯誤處理、包管理、函數式特性、並發機制等實用工具,以及兩個完整的項目開發實戰案例。作為開源的繫統級編程語言,Rust可以幫助你編寫出更為快速且更為可靠的軟件,在給予開發者底層控制能力的同時,通過深思熟慮的工程設計避免了傳統語言帶來的諸多麻煩。本書被視為Rust開發工作的推薦閱讀書目,適合所有希望評估、入門、提高和研究Rust語言的軟件開發人員閱讀。