這是一部注重編碼能力訓練的實戰(zhàn)性著作,既能幫助讀者扎實掌握Rust的主要語法知識并具備實戰(zhàn)能力,又能指導讀者快速從初學者晉級為高手。
全書秉持學以致用的原則:一方面,沒有事無巨細地羅列Rust的每一個語法知識點,但是常用知識點和重要知識點悉數(shù)囊括;一方面,將各種常見數(shù)據(jù)結構和算法與Rust編程實戰(zhàn)相結合,同時精選39道LeetCode高頻算法面試題,幫助讀者快速語法知識固化為實戰(zhàn)能力。
全書共15章,分為3個部分:
第1部分(第1~11章) Rust編程必備語法
非常有針對性地講解了Rust的常用語法,由淺入深,循序漸進,能幫助讀者快速掌握Rust的必備語法知識并具備基本的編程能力
第二部分(第12~13章) Rust編碼能力訓練
將數(shù)組、棧、隊列、哈希表、鏈表、樹等實用的數(shù)據(jù)結構和遞歸、分治、回溯、二分查找、深度優(yōu)先搜索、廣度優(yōu)先搜索、排序、動態(tài)規(guī)劃等常用算法與Rust編程實戰(zhàn)結合,并精選39道LeetCode高頻算法面試真題,幫助讀者將語法知識轉化為編程實戰(zhàn)能力。
第三部分(第14~15章) Rust綜合進階實戰(zhàn)
以排序算法為主題,圍繞功能拓展和性能拓展兩條主線,結合工程管理、泛型、trait系統(tǒng)、高階函數(shù)、閉包、迭代器、單元測試、多線程并發(fā)和異步并發(fā)等重要的語法知識點進行綜合實戰(zhàn)訓練,進一步在實戰(zhàn)中提升編程水平。
適讀人群 :本書內容的安排由淺入深,即使沒有任何 Rust 編程經(jīng)驗的開發(fā)者也可以學習參考。本書適用于以下幾類讀者:?有高級語言(如 Java、Python、Go、C++ 等)編程經(jīng)驗的開發(fā)者;?計 (1)作者資深:10余年開發(fā)經(jīng)驗,Rust技術專家、區(qū)塊鏈技術專家,Web3meta Labs創(chuàng)始人兼CTO、Polkadot(波卡)技術大使。
(2)針對性強:針對性講解Rust常用語法和重點知識,助讀者快速掌握Rust編程必備能力。
(3)深入淺出:大幅降低Rust學習門檻,即使沒有任何 Rust 編程經(jīng)驗的讀者也能快速上手。
(4)學以致用:將各種常見數(shù)據(jù)結構和算法與Rust編程實戰(zhàn)相結合,幫助讀者將語法知識固化為實戰(zhàn)能力。
(5)注重實戰(zhàn):以編碼能力訓練為核心,圍繞并發(fā)編程等高階知識進行綜合訓練,幫助讀者快速在實戰(zhàn)中實現(xiàn)提升。
【為什么要寫這本書】
雖然對Rust語言早有耳聞,但真正接觸Rust還緣于筆者在“一塊+”區(qū)塊鏈技術社區(qū)參加的陳錫亮老師主講的“Substrate快速入門與開發(fā)實戰(zhàn)”課程。Substrate是一個開源的區(qū)塊鏈開發(fā)框架,由Parity團隊使用Rust語言編寫。想學好Substrate,毋庸置疑得先學好Rust。因此筆者深入研讀了最權威的官方教程The Rust Programming Language、以代碼展示方式講解語法的Rust by Example以及深入底層系統(tǒng)介紹Rust設計哲學的《Rust編程之道》等著作。雖有10年以上編程經(jīng)驗,熟悉Java、Python、Go等語言,但在學習Rust編程的過程中,筆者依然有嚴重的挫折感。挫折感的來源有以下三點。
一是初學者對Rust語言中一些特有的語法和符號需要一個適應過程。
二是Rust編譯器內建各種安全檢查規(guī)則,加上獨有的所有權系統(tǒng),在編寫稍微復雜的程序時,幾乎難以做到一次編譯就成功通過,需要經(jīng)歷反復的修改與編譯調試。
三是Rust編程中關于引用、智能指針的使用,以及在編寫Unsafe Rust過程中如何保證內存安全很復雜,對Java、Python、Go等語言的開發(fā)者也是較大的挑戰(zhàn)。
另外,縱觀市面上Rust圖書的共同點,大多側重于對Rust設計思想的介紹、對語法使用以及實現(xiàn)原理的詳細講解,缺乏有效的編程實戰(zhàn)教程。
因此,經(jīng)過一段時間的深入思考,筆者決定撰寫本書,并嘗試將不限語言的數(shù)據(jù)結構和算法與Rust編程實戰(zhàn)進行結合,讓讀者可以憑借以往的編程基礎使用Rust語言進行實戰(zhàn),在實戰(zhàn)中鞏固各知識點,提升Rust編程能力。學以致用是貫穿本書的理念。
【讀者對象】
本書內容由淺入深,即使沒有任何Rust編程經(jīng)驗的開發(fā)者也可以學習參考。本書適用于以下幾類讀者。
●有高級語言(如Java、Python、Go、C++等)編程經(jīng)驗的開發(fā)者;
●正在從事軟件開發(fā)工作的開發(fā)者;
●計算機軟件及相關專業(yè)的學生;
●其他有一定數(shù)據(jù)結構和算法經(jīng)驗且對Rust感興趣的讀者。
【本書特色】
以往常聽一些朋友抱怨,且筆者在學習過程中也有類似感受:“學習一門新的語言,對入門書籍閱讀過半,還只會寫Hello World程序,繼續(xù)學習后面的章節(jié)卻已忘記了前面的內容!敝猿霈F(xiàn)這種情況,主要是因為初學者很容易糾纏于語法細節(jié)的學習,鉆一些深奧復雜卻不常用的語法的“牛角尖”,導致“從入門到放棄”的情況時有發(fā)生。特別是Rust編程的初學者,如果一開始就囿于Rust語法細節(jié),很容易因受挫而放棄。
筆者較為推崇的學習方式是,掌握一門語言最基礎的語法知識后就進行編程實戰(zhàn)訓練,實踐中遇到了問題再去探究深層原理和細節(jié)。這樣比一開始就進行“面面俱到、點點探究”的學習會更有收獲,理解也更為透徹。因此,本書將秉持學以致用的原則進行講解,不事無巨細地羅列一個個知識點,也不立刻探究背后的原理和細節(jié),而是幫助讀者以最快的速度掌握Rust編程所需的基本概念和基礎語法,快速進入編程實戰(zhàn)訓練,以刻意練習的方式讓讀者掌握每個知識點。這里的刻意練習包含以下三個方面的要求。
一是在“學習區(qū)”學習。跳出學習的“舒適區(qū)”,選擇有難度、有挑戰(zhàn)的知識學習。數(shù)據(jù)結構和算法的優(yōu)劣取決于開發(fā)者的技術功底,而開發(fā)者對數(shù)據(jù)結構和算法知識的掌握程序決定了他們在面對新問題時分析問題和解決問題的能力。因此,結合數(shù)據(jù)結構與算法的知識點進行編程訓練,能使讀者快速建立對Rust編程的認知,是挖掘自身成長潛能的重要手段和開發(fā)高性能程序的必備基礎。
二是大量重復練習。只有不斷地重復練習,才能真正掌握知識點。本書精選LeetCode平臺上與Rust語法知識點相關的一些高頻算法面試真題,在細致講解與代碼實現(xiàn)中,把重要的語法知識點通過題目復現(xiàn),幫助讀者在重復練習中真正做到各個知識點的熟練掌握與融會貫通;同時,還會把初學者在練習中遇到的常見問題以及解決問題的過程展現(xiàn)出來,使讀者在逐步解決問題中鞏固知識點。
三是及時測評反饋。沒有及時反饋的練習往往是無效的。本書將協(xié)助讀者在LeetCode平臺上進行練習并及時獲得測評反饋,增加讀者的學習興趣。
【如何閱讀本書】
本書分為三篇,具體內容如下。
●語言基礎篇(第1~11章):介紹Rust編程中必須掌握的基礎語法。
●編程能力訓練篇(第12~13章):將數(shù)組、棧、隊列、哈希表、鏈表、樹等實用的數(shù)據(jù)結構和遞歸、分治、回溯、二分查找、排序、動態(tài)規(guī)劃等常用算法與Rust編程實戰(zhàn)結合進行講解,并精選了LeetCode上的一些高頻算法面試真題,使用Rust語言進行編程實戰(zhàn)。
●綜合實戰(zhàn)篇(第14~15章):以排序算法為主題,圍繞功能拓展和性能拓展兩條主線,結合工程管理、泛型、trait系統(tǒng)、高階函數(shù)、閉包、迭代器、單元測試、多線程并發(fā)和異步并發(fā)等重要的語法知識點進行綜合實戰(zhàn)訓練。
如果你具備Rust基礎語法知識,可以直接從第2章或編程能力訓練篇開始閱讀。但如果你是一名初學者,建議按照本書的編排順序從第1章開始學習。
●筆者運營公眾號“沖鴨Rust和區(qū)塊鏈”,分享Rust、算法和區(qū)塊鏈開發(fā)的原創(chuàng)技術。考慮到本書定位于快速入門實戰(zhàn),沒有涉及Rust宏和Unsafe編程,筆者后續(xù)計劃從Substrate和libp2p源碼解析的角度寫一些進階版實戰(zhàn)系列來講解這些知識點,并會分享在公眾號上供大家參考。
●隨書源碼地址:https://github.com/inrust/Rust-Programming-in-Action。
朱春雷,北京大學軟件工程碩士,資深Rust技術專家和區(qū)塊鏈技術專家,有10年以上軟件開發(fā)經(jīng)驗。 Web3meta Labs創(chuàng)始人兼首席技術官,Polkadot(波卡)技術大使,熟悉區(qū)塊鏈技術框架Substrate開發(fā)。Web3meta Labs致力于為Ethereum、Polkadot等領先的區(qū)塊鏈項目打造基礎設施。
【語言基礎篇】
●第1章 初識Rust2
1.1 Rust語言簡介2
1.2 搭建編程環(huán)境3
1.3 Hello Rust4
1.4 Hello Cargo5
1.5 本章小結7
●第2章 變量與數(shù)據(jù)類型8
2.1 變量和可變性8
2.1.1 變量聲明8
2.1.2 變量的可變性9
2.1.3 變量遮蔽9
2.1.4 常量10
2.2 基本數(shù)據(jù)類型11
2.2.1 整數(shù)類型11
2.2.2 浮點數(shù)類型12
2.2.3 布爾類型12
2.2.4 字符類型12
2.2.5 范圍類型12
2.3 復合數(shù)據(jù)類型13
2.3.1 元組類型13
2.3.2 數(shù)組類型14
2.3.3 結構體類型15
2.3.4 枚舉類型17
2.4 容器類型18
2.4.1 Vec18
2.4.2 VecDeque21
2.4.3 HashMap25
2.5 字符串28
2.5.1 字符串的創(chuàng)建29
2.5.2 字符串的修改29
2.5.3 字符串的訪問32
2.6 字面量和運算符34
2.6.1 字面量34
2.6.2 運算符34
2.7 本章小結35
●第3章 流程控制37
3.1 條件判斷37
3.1.1 if條件判斷37
3.1.2 if-else條件判斷38
3.1.3 if-else if-else條件判斷38
3.2 循環(huán)39
3.2.1 loop循環(huán)39
3.2.2 while循環(huán)40
3.2.3 for循環(huán)40
3.2.4 continue和break語句41
3.3 match模式匹配41
3.4 if let和while let模式匹配42
3.5 本章小結43
●第4章 函數(shù)、閉包與迭代器44
4.1 函數(shù)44
4.1.1 定義函數(shù)44
4.1.2 方法和函數(shù)46
4.1.3 高階函數(shù)47
4.2 閉包50
4.2.1 基本語法50
4.2.2 類型推斷50
4.2.3 捕獲環(huán)境變量51
4.3 迭代器51
4.3.1 Iterator trait52
4.3.2 消費器52
4.3.3 迭代器適配器54
4.4 本章小結56
●第5章 類型系統(tǒng)57
5.1 泛型57
5.1.1 泛型與容器57
5.1.2 泛型與結構體58
5.1.3 泛型與枚舉60
5.1.4 泛型與函數(shù)61
5.1.5 泛型與方法61
5.2 trait系統(tǒng)62
5.2.1 trait定義與實現(xiàn)62
5.2.2 trait作為參數(shù)63
5.2.3 返回實現(xiàn)trait的類型66
5.2.4 標準庫常用trait66
5.3 類型轉換71
5.3.1 原生類型間的轉換71
5.3.2 數(shù)字與String類型間的轉換72
5.3.3 &str與String類型間的轉換73
5.4 本章小結73
●第6章 所有權系統(tǒng)74
6.1 通用概念74
6.1.1 棧內存與堆內存74
6.1.2 值語義與引用語義75
6.1.3 復制語義與移動語義75
6.2 所有權機制76
6.2.1 變量綁定76
6.2.2 所有權轉移77
6.2.3 淺復制與深復制81
6.3 引用和借用83
6.3.1 引用與可變引用83
6.3.2 借用規(guī)則87
6.3.3 借用示例1:切片88
6.3.4 借用示例2:迭代器90
6.4 生命周期92
6.4.1 生命周期語法92
6.4.2 懸垂引用94
6.4.3 生命周期與函數(shù)96
6.4.4 生命周期與結構體98
6.4.5 生命周期省略規(guī)則100
6.5 本章小結100
●第7章 智能指針102
7.1 獨占所有權的Box102
7.1.1 Box在堆上存儲數(shù)據(jù)102
7.1.2 Deref解引用103
7.1.3 Drop清理資源104
7.2 共享所有權的Rc105
7.3 應對內部可變性的RefCell106
7.4 本章小結108
●第8章 并發(fā)編程109
8.1 多線程并發(fā)109
8.1.1 線程管理110
8.1.2 線程池114
8.2 異步并發(fā)115
8.2.1 async/.await語法115
8.2.2 async-std庫117
8.3 本章小結119
●第9章 錯誤處理120
9.1 Result120
9.1.1 高效處理Result121
9.1.2 處理不同類型的錯誤122
9.1.3 傳播錯誤123
9.2 Panic125
9.2.1 追蹤Panic125
9.2.2 捕獲Panic126
9.3 本章小結127
●第10章 模塊化編程128
10.1 crate管理128
10.1.1 使用Cargo創(chuàng)建crate129
10.1.2 使用第三方crate129
10.2 module系統(tǒng)130
10.2.1 定義模塊130
10.2.2 創(chuàng)建多文件模塊131
10.2.3 多文件模塊的層級關系132
10.2.4 模塊的可見性133
10.2.5 使用use導入模塊135
10.2.6 模塊的路徑136
10.2.7 使用pub use重導出136
10.2.8 加載外部crate137
10.3 本章小結138
●第11章 單元測試139
11.1 單元測試框架139
11.2 編寫測試140
11.2.1 使用assert!140
11.2.2 使用assert_eq!和assert_ne!141
11.2.3 自定義失敗信息142
11.3 運行測試143
11.3.1 運行部分測試144
11.3.2 忽略某些測試145
11.4 本章小結146
【編程能力訓練篇】
●第12章 數(shù)據(jù)結構實戰(zhàn)148
12.1 數(shù)組148
12.1.1 移動零149
12.1.2 加一156
12.1.3 刪除排序數(shù)組中的重復項158
12.2 棧與隊列159
12.2.1 最小棧160
12.2.2 有效的括號163
12.2.3 滑動窗口最大值165
12.3 哈希表168
12.3.1 兩數(shù)之和170
12.3.2 有效的字母異位詞172
12.3.3 字母異位詞分組174
12.4 鏈表179
12.4.1 反轉鏈表182
12.4.2 鏈表的中間節(jié)點183
12.4.3 合并兩個有序鏈表185
12.4.4 刪除鏈表的倒數(shù)第n個節(jié)點187
12.5 樹191
12.5.1 二叉樹的前序遍歷195
12.5.2 二叉樹的中序遍歷199
12.5.3 二叉樹的后序遍歷202
12.5.4 二叉樹的層次遍歷206
12.5.5 二叉搜索樹中的插入操作208
12.6 本章小結211
●第13章 算法實戰(zhàn)213
13.1 遞歸、分治與回溯213
13.1.1 pow(x, n)216
13.1.2 爬樓梯218
13.1.3 括號生成220
13.1.4 子集222
13.1.5 組合224
13.1.6 N皇后227
13.2 二分查找230
13.2.1 搜索旋轉排序數(shù)組231
13.2.2 尋找旋轉排序數(shù)組中的最小值232
13.2.3 有效的完全平方數(shù)235
13.3 深度與廣度優(yōu)先搜索236
13.3.1 二叉樹的最大深度239
13.3.2 二叉樹的最小深度242
13.3.3 二叉搜索樹中的搜索244
13.4 排序算法246
13.4.1 數(shù)組中的第k個最大元素257
13.4.2 合并區(qū)間259
13.4.3 翻轉對261
13.5 動態(tài)規(guī)劃264
13.5.1 爬樓梯265
13.5.2 最小路徑和267
13.5.3 三角形最小路徑和269
13.5.4 零錢兌換270
13.5.5 最長上升子序列273
13.5.6 編輯距離274
13.6 本章小結277
【綜合實戰(zhàn)篇】
●第14章 泛型與高階函數(shù)實戰(zhàn)280
14.1 工程管理280
14.2 泛型編程281
14.2.1 插入排序算法282
14.2.2 加載算法庫284
14.2.3 結構體實例排序285
14.3 高階函數(shù)編程287
14.3.1 排序算法庫287
14.3.2 生成隨機數(shù)據(jù)291
14.3.3 排序算法API庫292
14.4 本章小結295
●第15章 并發(fā)編程實戰(zhàn)296
15.1 多線程并發(fā)296
15.2 異步并發(fā)298
15.2.1 排序算法庫的異步實現(xiàn)298
15.2.2 排序算法API庫的異步實現(xiàn)302
15.2.3 創(chuàng)建可執(zhí)行程序303
15.3 本章小結305