Rust編程之道
鏈接:https://pan.baidu.com/s/1E4FA5gVj4EPA81UheIUzOg?pwd=moxq?
提取碼:moxq
? ? Rust 是一門利用現(xiàn)代化的類型系統(tǒng),有機(jī)地融合了內(nèi)存管理、所有權(quán)語(yǔ)義和混合編程范式的編程語(yǔ)言。它不僅能科學(xué)地保證程序的正確性,還能保證內(nèi)存安全和線程安全。同時(shí),還有能與C/C++語(yǔ)言媲美的性能,以及能和動(dòng)態(tài)語(yǔ)言媲美的開(kāi)發(fā)效率。本書(shū)并非對(duì)語(yǔ)法內(nèi)容進(jìn)行簡(jiǎn)單羅列講解,而是從四個(gè)維度深入全面且通透地介紹了Rust 語(yǔ)言。從設(shè)計(jì)哲學(xué)出發(fā),探索Rust 語(yǔ)言的內(nèi)在一致性;從源碼分析入手,探索Rust 地道的編程風(fēng)格;從工程角度著手,探索Rust 對(duì)健壯性的支持;從底層原理開(kāi)始,探索Rust 內(nèi)存安全的本質(zhì)。本書(shū)涵蓋了Rust 2018 的特性,適合有一定編程經(jīng)驗(yàn)且想要學(xué)習(xí)Rust 的初學(xué)者,以及對(duì)Rust 有一定的了解,想要繼續(xù)深入學(xué)習(xí)的進(jìn)階者。
作者介紹
? ? 張漢東,80后,資深軟件工程師、企業(yè)獨(dú)立咨詢師、技術(shù)作者譯者。愛(ài)好讀書(shū)、寫作,喜歡研究技術(shù)、學(xué)習(xí)之道,以及心智和認(rèn)知開(kāi)發(fā)模式。曾在互聯(lián)網(wǎng)行業(yè)沉浮十余載,先后效力于電商、社交游戲、廣告和眾籌領(lǐng)域。作為企業(yè)獨(dú)立咨詢師,先后為思科、平安科技和閃迪等公司提供咨詢服務(wù)。目前在心智教育及創(chuàng)客領(lǐng)域開(kāi)疆拓土。是《Ruby原理剖析》一書(shū)的譯者。喜歡Rust語(yǔ)言,為Rust語(yǔ)言提交了三次編譯器Bug,并協(xié)助修復(fù)其中之一。為官方Rust 2018 Guide做過(guò)貢獻(xiàn),并數(shù)次提出改進(jìn)意見(jiàn)。參與了國(guó)內(nèi)Rust社區(qū)的管理和運(yùn)營(yíng),在2018年打造了《Rust每日新聞》頻道,深受Rustacean們的喜愛(ài)。為初學(xué)者精心打造了Rust必學(xué)第一課:知乎Live《如何系統(tǒng)地學(xué)習(xí)Rust語(yǔ)言》,獲得五星好評(píng)。
關(guān)聯(lián)推薦
適合本書(shū)的讀者群體包括: 1. 有一定編程經(jīng)驗(yàn),想要學(xué)習(xí)Rust的初學(xué)者。 2. 對(duì)Rust有一定了解,還想對(duì)Rust深入學(xué)習(xí)的進(jìn)階者。 本書(shū)不適合完全沒(méi)有編程基礎(chǔ)的人學(xué)習(xí)。
目錄
第1 章 新時(shí)代的語(yǔ)言 .. 1
1.1 緣起 ... 1
1.2 設(shè)計(jì)哲學(xué) ....... 3
1.2.1 內(nèi)存安全....... 3
1.2.2 零成本抽象 ... 4
1.2.3 實(shí)用性 .......... 5
1.3 現(xiàn)狀與未來(lái) ... 7
1.3.1 語(yǔ)言架構(gòu)....... 8
1.3.2 開(kāi)源社區(qū)....... 9
1.3.3 發(fā)展前景....... 9
1.4 Rust 代碼如何執(zhí)行? 10
1.5 小結(jié) . 10
第2 章 語(yǔ)言精要 ........ 11
2.1 Rust 語(yǔ)言的基本構(gòu)成 ......... 11
2.1.1 語(yǔ)言規(guī)范..... 11
2.1.2 編譯器 ........ 12
2.1.3 核心庫(kù) ........ 12
2.1.4 標(biāo)準(zhǔn)庫(kù) ........ 12
2.1.5 包管理器..... 13
2.2 語(yǔ)句與表達(dá)式 ......... 13
2.3 變量與綁定 . 14
2.3.1 位置表達(dá)式和值表達(dá)式 ..... 15
2.3.2 不可變綁定與可變綁定 ..... 15
2.3.3 所有權(quán)與引用 ......... 16
2.4 函數(shù)與閉包 . 17
2.4.1 函數(shù)定義..... 17
2.4.2 作用域與生命周期 . 18
2.4.3 函數(shù)指針..... 19
2.4.5 CTFE 機(jī)制 .. 20
2.4.6 閉包? 20
2.5 流程控制 ..... 22
2.5.1 條件表達(dá)式 . 22
2.5.2 循環(huán)表達(dá)式 . 23
2.5.3 match 表達(dá)式與模式匹配 .. 24
2.5.4 if let 和while let 表達(dá)式 .... 25
2.6 基本數(shù)據(jù)類型 ......... 26
2.6.1 布爾類型..... 26
2.6.2 基本數(shù)字類型 ......... 26
2.6.3 字符類型..... 27
2.6.4 數(shù)組類型..... 28
2.6.5 范圍類型..... 29
2.6.6 切片類型..... 29
2.6.7 str 字符串類型 ........ 30
2.6.8 原生指針..... 31
2.6.9 never 類型 ... 31
2.7 復(fù)合數(shù)據(jù)類型 ......... 32
2.7.1 元組? 32
2.7.2 結(jié)構(gòu)體 ........ 33
2.7.3 枚舉體 ........ 36
2.8 常用集合類型 ......... 38
2.8.1 線性序列:向量 ..... 38
2.8.2 線性序列:雙端隊(duì)列 ......... 39
2.8.3 線性序列:鏈表 ..... 40
2.8.4 Key-Value 映射表:HashMap 和BTreeMap ........ 40
2.8.5 集合:HashSet 和BTreeSet .......... 41
2.8.6 優(yōu)先隊(duì)列:BinaryHeap ..... 42
2.9 智能指針 ..... 42
2.10 泛型和trait ........... 43
2.10.1 泛型 .......... 43
2.10.2 trait? 44
2.11 錯(cuò)誤處理 ... 47
2.12 表達(dá)式優(yōu)先級(jí) ....... 48
2.13 注釋與打印 ........... 48
2.14 小結(jié) ........... 50
第3 章 類型系統(tǒng) ........ 51
3.1 通用概念 ..... 51
3.1.1 類型系統(tǒng)的作用 ..... 51
3.1.2 類型系統(tǒng)的分類 ..... 52
3.1.3 類型系統(tǒng)與多態(tài)性 . 53
3.2 Rust 類型系統(tǒng)概述? 53
3.2.1 類型大小..... 53
3.2.2 類型推導(dǎo)..... 58
3.3 泛型 . 60
3.3.1 泛型函數(shù)..... 60
3.3.2 泛型返回值自動(dòng)推導(dǎo) ......... 62
3.4 深入trait ..... 62
3.4.1 接口抽象..... 63
3.4.2 泛型約束..... 69
3.4.3 抽象類型..... 71
3.4.4 標(biāo)簽trait ..... 77
3.5 類型轉(zhuǎn)換 ..... 83
3.5.1 Deref 解引用 .......... 83
3.5.2 as 操作符 .... 86
3.5.3 From 和Into ........... 88
3.6 當(dāng)前trait 系統(tǒng)的不足 ........ 89
3.6.1 孤兒規(guī)則的局限性 . 90
3.6.2 代碼復(fù)用的效率不高 ......... 91
3.6.3 抽象表達(dá)能力有待改進(jìn) ..... 93
3.7 小結(jié) . 94
第4 章 內(nèi)存管理 ........ 95
4.1 通用概念 ..... 95
4.1.1 棧 .... 96
4.1.2 堆 .... 99
4.1.3 內(nèi)存布局... 101
4.2 Rust 中的資源管理 ...........103
4.2.1 變量和函數(shù) ........... 103
4.2.2 智能指針與RAII . 106
4.2.3 內(nèi)存泄漏與內(nèi)存安全 ....... 110
4.2.4 復(fù)合類型的內(nèi)存分配和布局 ....... 115
4.3 小結(jié)? 117
第5 章 所有權(quán)系統(tǒng) .. 119
5.1 通用概念 ....120
5.2 所有權(quán)機(jī)制 123
5.3 綁定、作用域和生命周期 125
5.3.1 不可變與可變 ....... 126
5.3.2 綁定的時(shí)間屬性——生命周期 ... 127
5.4 所有權(quán)借用 131
5.5 生命周期參數(shù) ........135
5.5.1 顯式生命周期參數(shù) ........... 136
5.5.2 省略生命周期參數(shù) ........... 143
5.5.3 生命周期限定 ....... 145
5.5.4 trait 對(duì)象的生命周期 ....... 145
5.6 智能指針與所有權(quán) 146
5.6.1 共享所有權(quán) Rc和Weak? 149
5.6.2 內(nèi)部可變性Cell和RefCell?........ 151
5.6.3 寫時(shí)復(fù)制Cow?........... 153
5.7 并發(fā)安全與所有權(quán) 156
5.8 非詞法作用域生命周期 ....157
5.9 小結(jié) 161
第6 章 函數(shù)、閉包與迭代器 162
6.1 函數(shù) 162
6.1.1 函數(shù)屏蔽... 164
6.1.2 函數(shù)參數(shù)模式匹配 ........... 164
6.1.3 函數(shù)返回值 ........... 165
6.1.4 泛型函數(shù)... 166
6.1.5 方法與函數(shù) ........... 167
6.1.6 高階函數(shù)... 168
6.2 閉包 171
6.2.1 閉包的基本語(yǔ)法 ... 172
6.2.2 閉包的實(shí)現(xiàn) ........... 173
6.2.3 閉包與所有權(quán) ....... 178
6.2.4 閉包作為函數(shù)參數(shù)和返回值 ....... 184
6.2.5 高階生命周期 ....... 190
6.3 迭代器 ........194
6.3.1 外部迭代器和內(nèi)部迭代器 ........... 194
6.3.2 Iterator trait ........... 195
6.3.3 IntoIterator trait 和迭代器? 199
6.3.4 迭代器適配器 ....... 202
6.3.5 消費(fèi)器 ...... 207
6.3.6 自定義迭代器適配器 ....... 211
6.4 小結(jié) 214
第7 章 結(jié)構(gòu)化編程 .. 216
7.1 面向?qū)ο箫L(fēng)格編程 217
7.1.1 結(jié)構(gòu)體 ...... 217
7.1.2 枚舉體 ...... 225
7.1.3 析構(gòu)順序... 230
7.2 常用設(shè)計(jì)模式 ........233
7.2.1 建造者模式 ........... 234
7.2.2 訪問(wèn)者模式 ........... 236
7.2.3 RAII 模式 . 239
7.3 小結(jié) 243
第8 章 字符串與集合類型 ... 244
8.1 字符串 ........244
8.1.1 字符編碼... 244
8.1.2 字符 .......... 247
8.1.3 字符串分類 ........... 249
8.1.4 字符串的兩種處理方式 ... 251
8.1.5 字符串的修改 ....... 253
8.1.6 字符串的查找 ....... 256
8.1.7 與其他類型相互轉(zhuǎn)換 ....... 265
8.1.8 回顧 .......... 270
8.2 集合類型 ....271
8.2.1 動(dòng)態(tài)可增長(zhǎng)數(shù)組 ... 271
8.2.2 映射集 ...... 281
8.3 理解容量 ....289
8.4 小結(jié) 292
第9 章 構(gòu)建健壯的程序 ....... 294
9.1 通用概念 ....294
9.2 消除失敗 ....295
9.3 分層處理錯(cuò)誤 ........297
9.3.1 可選值Option? 298
9.3.2 錯(cuò)誤處理Result?.... 302
9.4 恐慌(Panic) .......314
9.5 第三方庫(kù) ....316
9.6 小結(jié) 319
第10 章 模塊化編程? 320
10.1 包管理 ......321
10.1.1 使用Cargo 創(chuàng)建包 ......... 321
10.1.2 使用第三方包 ..... 323
10.1.3 Cargo.toml 文件格式 ...... 331
10.1.4 自定義Cargo ...... 337
10.2 模塊系統(tǒng) ..339
10.3 從零開(kāi)始實(shí)現(xiàn)一個(gè)完整功能包 ..344
10.3.1 使用Cargo 創(chuàng)建新項(xiàng)目 . 345
10.3.2 使用structopt 解析命令行參數(shù) . 345
10.3.3 定義統(tǒng)一的錯(cuò)誤類型 ..... 347
10.3.4 讀取CSV 文件 ... 348
10.3.5 替換CSV 文件中的內(nèi)容 ........... 351
10.3.6 進(jìn)一步完善包 ..... 353
10.4 可見(jiàn)性和私有性 ..358
10.5 小結(jié) ..........360
第11 章 安全并發(fā) .... 362
11.1 通用概念 ..362
11.1.1 多進(jìn)程和多線程 . 363
11.1.2 事件驅(qū)動(dòng)、異步回調(diào)和協(xié)程 ..... 364
11.1.3 線程安全 . 365
11.2 多線程并發(fā)編程 ..370
11.2.1 線程管理 . 371
11.2.2 Send 和Sync ....... 375
11.2.3 使用鎖進(jìn)行線程同步 ..... 379
11.2.4 屏障和條件變量 . 384
11.2.5 原子類型 . 386
11.2.6 使用Channel 進(jìn)行線程間通信 .. 388
11.2.7 內(nèi)部可變性探究 . 397
11.2.8 線程池 ..... 399
11.2.9 使用Rayon 執(zhí)行并行任務(wù) ........ 407
11.2.10 使用Crossbeam? 409
11.3 異步并發(fā) ..412
11.3.1 生成器 ..... 413
11.3.2 Future 并發(fā)模式 . 418
11.3.3 async/await .......... 421
11.4 數(shù)據(jù)并行 ..428
11.4.1 什么是SIMD ...... 429
11.4.2 在Rust 中使用SIMD..... 430
11.5 小結(jié) ..........434
第12 章 元編程 ....... 435
12.1 反射 ..........436
12.1.1 通過(guò)is 函數(shù)判斷類型 .... 436
12.1.2 轉(zhuǎn)換到具體類型 . 437
12.1.3 非靜態(tài)生命周期類型 ..... 439
12.2 宏系統(tǒng) ......440
12.2.1 起源 ........ 440
12.2.2 Rust 中宏的種類? 441
12.2.3 編譯過(guò)程 . 442
12.2.4 聲明宏 .... 445
12.2.5 過(guò)程宏 .... 458
12.3 編譯器插件 ..........472
12.4 小結(jié) ..........475
第13 章 安全的邊界 ..... 477
13.1 Unsafe Rust 介紹 .477
13.1.1 Unsafe 語(yǔ)法 ........ 478
13.1.2 訪問(wèn)和修改可變靜態(tài)變量 ......... 480
13.1.3 Union 聯(lián)合體 ...... 480
13.1.4 解引用原生指針 . 483
13.2 基于Unsafe 進(jìn)行安全抽象 .........484
13.2.1 原生指針 . 484
13.2.2 子類型與型變 ..... 489
13.2.3 未綁定生命周期 . 494
13.2.4 Drop 檢查 ........... 495
13.2.5 NonNull指針? 505
13.2.6 Unsafe 與恐慌安全 ........ 508
13.2.7 堆內(nèi)存分配 ......... 508
13.2.8 混合代碼內(nèi)存安全架構(gòu)三大原則 ......... 510
13.3 和其他語(yǔ)言交互 ..510
13.3.1 外部函數(shù)接口 ..... 510
13.3.2 與C/C++語(yǔ)言交互 ......... 514
13.3.3 使用Rust 提升動(dòng)態(tài)語(yǔ)言性能 ... 528
13.4 Rust 與WebAssembly .....532
13.4.1 WebAssembly 要點(diǎn)介紹. 533
13.4.2 使用Rust 開(kāi)發(fā)WebAssembly ... 539
13.4.3 打造WebAssembly 開(kāi)發(fā)生態(tài) .... 541
13.5 小結(jié) ..........543
附錄A Rust 開(kāi)發(fā)環(huán)境指南 ... 544
附錄B Rust 如何調(diào)試代碼 ... 549
