本書涵蓋了不同境環(huán)和體系架構(gòu)設(shè)計(jì)下配置Rust的技巧,并提供了解決實(shí)際問題的方案。首先介紹了Rust的核心概念,使讀者能創(chuàng)建高效、高性能的應(yīng)用,其中會(huì)使用各種Rust特性,如零成本抽象和改進(jìn)內(nèi)存管理。本書還介紹了更高級(jí)的主題(包括通道和actor),能構(gòu)建可伸縮的生產(chǎn)級(jí)別的應(yīng)用,還會(huì)學(xué)習(xí)錯(cuò)誤處理、宏和模塊化來編寫可維護(hù)的代碼。
前言
許多年前,就像很多程序員一樣,我開始每年學(xué)習(xí)一種新的編程語言。通過學(xué)習(xí)另一個(gè)編程語言,可以了解很多范式和規(guī)則,并得到一些想法,然后我發(fā)現(xiàn)了Rust。一開始寫Rust代碼就非常有趣,讓人無法挪步,而且經(jīng)過一個(gè)陡峭的學(xué)習(xí)曲線后,它變得越發(fā)有趣。所以,總共學(xué)習(xí)了兩個(gè)額外的語言后(TypeScript和Rust),我堅(jiān)定地選擇了Rust。為什么? 下面來告訴你原因。
Rust是一個(gè)系統(tǒng)編程語言,會(huì)默認(rèn)地提供內(nèi)存安全性而無需垃圾回收器,這會(huì)影響其運(yùn)行時(shí)行為。盡管如此,Rust是一個(gè)相當(dāng)全能的語言,可以在不同領(lǐng)域中使用,不論是Web編程、游戲引擎還是Web客戶端,都可以使用Rust。另外,它對(duì)有關(guān)作用域和內(nèi)存分配的傳統(tǒng)思維發(fā)出挑戰(zhàn),會(huì)讓你成為一個(gè)可以駕馭任何語言的更好的程序員,無論是C#、Java還是Python。Amazon、Microsoft和Google等公司的最新動(dòng)向表明,這個(gè)生態(tài)系統(tǒng)現(xiàn)在已經(jīng)發(fā)展到相當(dāng)穩(wěn)定的程度,已經(jīng)足以讓企業(yè)安心使用,這對(duì)未來的Rust專業(yè)人員來說是一個(gè)很好的信號(hào)。
在這本書中,我們匯編了最有用的實(shí)驗(yàn),提供了實(shí)用的用例,使你能快速在生產(chǎn)環(huán)境中使用。我們努力涵蓋了各種不同的應(yīng)用,希望你能從中找到有用的概念,以及可以直接用于日常開發(fā)工作的解決方案。
本書面向?qū)ο?/span>
這本書與學(xué)習(xí)編程語言通常使用的書有所不同。這里沒有很深入地探究概念,我們希望展示各種可能的項(xiàng)目、解決方案和應(yīng)用,提供進(jìn)一步的概念和其他資源的鏈接。所以,我們認(rèn)為這本書很適合那些想要快速開發(fā)實(shí)用應(yīng)用的人,而無論他們有多少Rust經(jīng)驗(yàn)。不過,編程基礎(chǔ)還是必要的(無論哪種語言),這是建立Rust技能的基礎(chǔ)。
本書內(nèi)容
第1章 Rust入門,介紹如何在你的計(jì)算機(jī)上建立Rust工具鏈,以及Rust語言的基本構(gòu)造。這包括為循環(huán)、if表達(dá)式、trait(特征)和struct(結(jié)構(gòu)體)等語言構(gòu)造編寫測(cè)試和基準(zhǔn)測(cè)試。
第2章 高級(jí)Rust進(jìn)階,將回答有關(guān)這個(gè)語言更高級(jí)特性的問題,并介紹創(chuàng)建實(shí)用程序的模式。這一章的內(nèi)容包括復(fù)雜場(chǎng)景中的借用和所有權(quán)、Option類型、模式匹配、泛型、顯式生命周期和enum (枚舉)。
第3章 用cargo管理項(xiàng)目,使用cargo工具管理額外的crate、擴(kuò)展、項(xiàng)目和測(cè)試。你會(huì)在這里找到有關(guān)技巧,可以幫助你處理更大的項(xiàng)目,并解決管理這些項(xiàng)目時(shí)面對(duì)的挑戰(zhàn)。
第4章 無畏并發(fā), 這一章會(huì)介紹一些最佳實(shí)踐和技巧來構(gòu)建安全、快速的程序。除此以外,還會(huì)介紹諸如Rayon等流行的庫,我們會(huì)展示Rust是完成各種并發(fā)任務(wù)的一個(gè)非常好的語言。
第5章 處理錯(cuò)誤和其他結(jié)果, 解釋Rust如何使用Result類型和panic (恐慌)來完成錯(cuò)誤處理,將大部分失敗用例集成到需要處理的一個(gè)常規(guī)工作流中。這一章將關(guān)于如何避免意外崩潰和不必要的復(fù)雜性為你展示一些實(shí)用的模式和最佳實(shí)踐。
第6章 用宏表達(dá),將解釋Rust特有的宏系統(tǒng)如何在編譯之前擴(kuò)展程序的功能(而且會(huì)采用一種類型安全的方式)?梢詾楹芏嗫赡艿淖远x場(chǎng)景實(shí)現(xiàn)這些宏,很多crate都使用了這個(gè)功能。這一章就是要介紹如何創(chuàng)建有用的宏,使你的生活更輕松,也讓你的程序更安全。
第7章 Rust與其他語言集成,會(huì)介紹如何在Rust中使用和處理不同的二進(jìn)制單元和語言,來移植遺留軟件,或者從更好的SDK獲益。這主要通過外部函數(shù)接口ForeignFunctionInterface,FFI)實(shí)現(xiàn),它支持與其他原生庫快速而容易地集成。不僅如此,還可以使用WebAssembly從Rust發(fā)布到npm (Node.js包存儲(chǔ)庫)。所有這些內(nèi)容都會(huì)在這一章討論。
第8章 Web安全編程,使用一個(gè)先進(jìn)的Web框架(actix-Web)介紹Web編程的基礎(chǔ)知識(shí),它展示了一種基于actor的方法來處理請(qǐng)求,這個(gè)Web框架在Microsoft得到了有效使用。
第9章 簡(jiǎn)化系統(tǒng)編程,解釋Rust為什么是在資源有限的小設(shè)備上運(yùn)行工作負(fù)載的一個(gè)很好的選擇。具體地,由于沒有垃圾回收器和相應(yīng)的可預(yù)測(cè)運(yùn)行時(shí)環(huán)境,這使它非常適合運(yùn)行傳感器數(shù)據(jù)收集器。這一章將介紹創(chuàng)建這樣一個(gè)循環(huán)并結(jié)合必要的驅(qū)動(dòng)器來讀取數(shù)據(jù)。
第10章 Rust實(shí)戰(zhàn),介紹Rust編程中的實(shí)際問題,如解析命令行參數(shù)、使用神經(jīng)網(wǎng)絡(luò)(使用PyTorch的C++ API實(shí)現(xiàn)機(jī)器學(xué)習(xí))、搜索、正則表達(dá)式、Web請(qǐng)求等。
目錄
序
前言
第1章 Rust入門 1
1.1 建立環(huán)境 1
1.1.1 準(zhǔn)備工作 2
1.1.2 實(shí)現(xiàn)過程 2
1.1.3 工作原理 4
1.2 使用命令行I/O 4
1.2.1 實(shí)現(xiàn)過程 4
1.2.2 工作原理 6
1.3 創(chuàng)建和使用數(shù)據(jù)類型 7
1.3.1 實(shí)現(xiàn)過程 7
1.3.2 工作原理 11
1.4 控制執(zhí)行流 12
1.4.1 實(shí)現(xiàn)過程 12
1.4.2 工作原理 15
1.5 用crate和模塊劃分代碼 16
1.5.1 準(zhǔn)備工作 16
1.5.2 實(shí)現(xiàn)過程 16
1.5.3 工作原理 21
1.6 編寫測(cè)試和基準(zhǔn)測(cè)試 22
1.6.1 準(zhǔn)備工作 22
1.6.2 實(shí)現(xiàn)過程 22
1.6.3 工作原理 27
1.7 為代碼提供文檔 28
1.7.1 準(zhǔn)備工作 29
1.7.2 實(shí)現(xiàn)過程 29
1.7.3 工作原理 32
1.8 測(cè)試你的文檔 33
1.8.1 準(zhǔn)備工作 33
1.8.2 實(shí)現(xiàn)過程 33
1.8.3 工作原理 37
1.9 在類型間共享代碼 38
1.9.1 實(shí)現(xiàn)過程 38
1.9.2 工作原理 42
1.10 Rust中的序列類型 43
1.10.1 實(shí)現(xiàn)過程 44
1.10.2 工作原理 46
1.11 調(diào)試Rust 47
1.11.1 準(zhǔn)備工作 47
1.11.2 實(shí)現(xiàn)過程 47
1.11.3 工作原理 50
第2章 高級(jí)Rust進(jìn)階 52
2.1 用枚舉創(chuàng)建有意義的數(shù) 52
2.1.1 實(shí)現(xiàn)過程 52
2.1.2 工作原理 56
2.2 沒有null 57
2.2.1 實(shí)現(xiàn)過程 57
2.2.2 工作原理 60
2.3 使用模式匹配的復(fù)雜條件 60
2.3.1 實(shí)現(xiàn)過程 61
2.3.2 工作原理 66
2.4 實(shí)現(xiàn)自定義迭代器 67
2.4.1 準(zhǔn)備工作 67
2.4.2 實(shí)現(xiàn)過程 67
2.4.3 工作原理 70
2.5 高效地過濾和轉(zhuǎn)換序列 71
2.5.1 準(zhǔn)備工作 71
2.5.2 實(shí)現(xiàn)過程 71
2.5.3 工作原理 74
2.6 以u(píng)nsafe方式讀取內(nèi)存 75
2.6.1 實(shí)現(xiàn)過程 75
2.6.2 工作原理 77
2.7 共享所有權(quán) 78
2.7.1 準(zhǔn)備工作 78
2.7.2 實(shí)現(xiàn)過程 79
2.7.3 工作原理 82
2.8 共享可變所有權(quán) 82
2.8.1 準(zhǔn)備工作 83
2.8.2 實(shí)現(xiàn)過程 83
2.8.3 工作原理 87
2.9 有顯式生命周期的引用 88
2.9.1 實(shí)現(xiàn)過程 88
2.9.2 工作原理 94
2.10 用trait綁定強(qiáng)制行為 94
2.10.1 實(shí)現(xiàn)過程 94
2.10.2 工作原理 97
2.11 使用泛型數(shù)據(jù)類型 97
2.11.1 實(shí)現(xiàn)過程 97
2.11.2 工作原理 102
第3章 用Cargo管理項(xiàng)目 104
3.1 利用工作空間組織大型項(xiàng)目 105
3.1.1 實(shí)現(xiàn)過程 105
3.1.2 工作原理 108
3.2 上傳到crates.io 110
3.2.1 準(zhǔn)備工作 110
3.2.2 實(shí)現(xiàn)過程 110
3.2.3 工作原理 115
3.3 使用依賴和外部crate 116
3.3.1 實(shí)現(xiàn)過程 116
3.3.2 工作原理 120
3.3.3 參考資料 121
3.4 用子命令擴(kuò)展cargo 121
3.4.1 準(zhǔn)備工作 122
3.4.2 實(shí)現(xiàn)過程 122
3.4.3 工作原理 122
3.5 用cargo測(cè)試你的項(xiàng)目 123
3.5.1 實(shí)現(xiàn)過程 123
3.5.2 工作原理 127
3.6 使用cargo持續(xù)集成 128
3.6.1 準(zhǔn)備工作 128
3.6.2 實(shí)現(xiàn)過程 128
3.6.3 工作原理 131
3.7 定制構(gòu)建 132
3.7.1 實(shí)現(xiàn)過程 132
3.7.2 工作原理 134
第4章 無畏并發(fā) 136
4.1 將數(shù)據(jù)移入線程 136
4.1.1 實(shí)現(xiàn)過程 137
4.1.2 工作原理 140
4.2 管理多個(gè)線程 141
4.2.1 實(shí)現(xiàn)過程 141
4.2.2 工作原理 142
4.3 使用通道在線程間通信 143
4.3.1 實(shí)現(xiàn)過程 143
4.3.2 工作原理 146
4.4 共享可變狀態(tài) 146
4.4.1 實(shí)現(xiàn)過程 146
4.4.2 工作原理 148
4.5 Rust中的多進(jìn)程 149
4.5.1 實(shí)現(xiàn)過程 149
4.5.2 工作原理 152
4.6 使順序代碼變?yōu)椴⑿?152
4.6.1 實(shí)現(xiàn)過程 152
4.6.2 工作原理 158
4.7 向量中的并發(fā)數(shù)據(jù)處理 158
4.7.1 實(shí)現(xiàn)過程 159
4.7.2 工作原理 166
4.8 共享不可變狀態(tài) 166
4.8.1 實(shí)現(xiàn)過程 167
4.8.2 工作原理 171
4.9 使用actor處理異步消息 171
4.9.1 實(shí)現(xiàn)過程 171
4.9.2 工作原理 174
4.10 使用future的異步編程 175
4.10.1 實(shí)現(xiàn)過程 175
4.10.2 工作原理 176
第5章 處理錯(cuò)誤和其他結(jié)果 178
5.1 負(fù)責(zé)任地恐慌 178
5.1.1 實(shí)現(xiàn)過程 178
5.1.2 工作原理 181
5.2 處理多個(gè)錯(cuò)誤 182
5.2.1 實(shí)現(xiàn)過程 182
5.2.2 工作原理 184
5.3 處理異常結(jié)果 185
5.3.1 實(shí)現(xiàn)過程 185
5.3.2 工作原理 188
5.4 無縫的錯(cuò)誤處理 188
5.4.1 實(shí)現(xiàn)過程 188
5.4.2 工作原理 190
5.5 定制錯(cuò)誤 191
5.5.1 實(shí)現(xiàn)過程 191
5.5.2 工作原理 193
5.6 彈性編程 193
5.6.1 實(shí)現(xiàn)過程 193
5.6.2 工作原理 194
5.7 使用外部crate來完成錯(cuò)誤處理 194
5.7.1 實(shí)現(xiàn)過程 195
5.7.2 工作原理 196
5.8 Option和Result間轉(zhuǎn)移 197
5.8.1 實(shí)現(xiàn)過程 197
5.8.2 工作原理 199
第6章 用宏表達(dá) 200
6.1 在Rust中構(gòu)建自定義宏 200
6.1.1 實(shí)現(xiàn)過程 201
6.1.2 工作原理 202
6.2 用宏實(shí)現(xiàn)匹配 203
6.2.1 實(shí)現(xiàn)過程 203
6.2.2 工作原理 205
6.3 使用預(yù)定義的宏 206
6.3.1 實(shí)現(xiàn)過程 206
6.3.2 工作原理 208
6.4 使用宏生成代碼 209
6.4.1 實(shí)現(xiàn)過程 209
6.4.2 工作原理 212
6.5 宏重載 213
6.5.1 實(shí)現(xiàn)過程 213
6.5.2 工作原理 216
6.6 為參數(shù)范圍使用重復(fù) 216
6.6.1 實(shí)現(xiàn)過程 217
6.6.2 工作原理 219
6.7 不要自我重復(fù) 219
6.7.1 實(shí)現(xiàn)過程 220
6.7.2 工作原理 222
第7章 與其他語言集成 223
7.1 包含遺留C代碼 223
7.1.1 準(zhǔn)備工作 224
7.1.2 實(shí)現(xiàn)過程 225
7.1.3 工作原理 229
7.2 從Node.js使用FFI調(diào)用Rust 231
7.2.1 準(zhǔn)備工作 231
7.2.2 實(shí)現(xiàn)過程 232
7.2.3 工作原理 235
7.3 在瀏覽器中運(yùn)行Rust 236
7.3.1 準(zhǔn)備工作 236
7.3.2 實(shí)現(xiàn)過程 237
7.3.3 工作原理 241
7.4 使用Rust和Python 242
7.4.1 準(zhǔn)備工作 242
7.4.2 實(shí)現(xiàn)過程 243
7.4.3 工作原理 249
7.5 為遺留應(yīng)用生成綁定 250
7.5.1 準(zhǔn)備工作 250
7.5.2 實(shí)現(xiàn)過程 251
7.5.3 工作原理 255
第8章 Web安全編程 256
8.1 建立 Web服務(wù)器 256
8.1.1 準(zhǔn)備工作 257