Rust 程式語言
一份全面的 Rust 入門指南,涵蓋系統程式設計概念、記憶體安全性、並行處理以及 Rust 工具鏈(Cargo、rustup)。課程從基本語法逐步過渡到建立完整的專案,例如多線程網路伺服器。
課程總覽
📚 內容概要
一本全面的 Rust 入門指南,涵蓋系統程式設計概念、記憶體安全、並行處理以及 Rust 工具鏈(Cargo、rustup)。內容從基本語法逐步過渡到建立完整專案,例如多線程網路伺服器。
掌握安全、高效且並行的系統程式設計藝術,這份最權威的 Rust 指南不容錯過。
作者: Steve Klabnik 與 Carol Nichols,並由 Rust 社群貢獻
致謝: 感謝 Rust 社群的貢獻;由 No Starch Press 出版紙本與電子書格式。
🎯 學習目標
- 成功在不同作業系統上使用
rustup安裝和管理 Rust 工具鏈。 - 寫出、編譯並執行一個基本的 Rust 程式,辨識程式碼的核心結構組成。
- 使用 Cargo 建立標準化的專案結構,管理建構流程,並產生優化後的發行版本二進位檔。
- 捕捉並儲存使用者輸入,同時妥善管理變數可變性與可能的 I/O 失敗。
- 使用 Cargo 整合外部依賴,並透過
Cargo.lock管理可重現的建構。 - 利用型別推論、字串解析、迴圈與
match控制流程運算子實作遊戲邏輯。 - 区分常數與變數遮蔽,以有效管理資料不可變性與作用域。
- 正確實作標量(整數、浮點數、布林值、字元)與複合型別(元組、陣列)。
- 釐清陳述句與表達式的差異,以定義具有特定回傳值的函式。
- 區分堆疊與堆記憶體,並解釋 Rust 如何管理堆上的資料。
🔹 第一課:開始使用 Rust
概述: 本課提供對 Rust 生態系統的全面介紹,重點放在環境設定與 Rust 開發者的基本工作流程。學生將從透過 rustup 安裝語言,到手動撰寫「Hello, World!」程式,最後掌握 Cargo——Rust 的官方建構系統與套件管理員——以進行專業專案管理與發行最佳化。
學習成果:
- 成功在不同作業系統上使用
rustup安裝與管理 Rust 工具鏈。 - 寫出、編譯並執行一個基本的 Rust 程式,辨識程式碼的核心結構組成。
- 使用 Cargo 建立標準化的專案結構,管理建構流程,並產生優化後的發行版本二進位檔。
🔹 第二課:動手實作:猜數字遊戲
概述: 本課引導開發者在 Rust 中建構一個功能完整的命令列介面(CLI)猜數字遊戲。內容涵蓋基礎系統程式設計概念,包括使用者輸入處理、整合外部套件以產生隨機數,以及 Rust 獨特的記憶體安全與錯誤處理方式,如 Result 類型與模式比對。課程結束時,學員將擁有一個能處理無效輸入並確保可重現建構的強健應用程式。
學習成果:
- 捕捉並儲存使用者輸入,同時妥善管理變數可變性與潛在的 I/O 失敗。
- 使用 Cargo 整合外部依賴,並透過
Cargo.lock管理可重現的建構。 - 利用型別推論、字串解析、迴圈與
match控制流程運算子實作遊戲邏輯。
🔹 第三課:常見程式設計概念
概述: 本課探討 Rust 程式設計的基礎構建模塊,著重於資料如何被儲存與操作。內容包含變數遮蔽與常數的細微差異、資料分類為標量與複合型別、函式的結構規則,以及控制流程與重複執行的邏輯。
學習成果:
- 区分常數與變數遮蔽,以有效管理資料不可變性與作用域。
- 正確實作標量(整數、浮點數、布林值、字元)與複合型別(元組、陣列)。
- 釐清陳述句與表達式的差異,以定義具有特定回傳值的函式。
🔹 第四課:理解擁有權與記憶體
概述: 本課探討 Rust 獨特的記憶體管理方法,即其「擁有權」系統。與依靠垃圾回收或手動記憶體管理不同,Rust 透過編譯時期檢查的一組規則來確保記憶體安全。本章涵蓋堆疊與堆的運作機制、資料的生命周期,以及參考與切片如何在不轉移擁有權的情況下提供安全且高效的記憶體存取。
學習成果:
- 區分堆疊與堆記憶體,並解釋 Rust 如何管理堆上的資料。
- 應用擁有權的三大規則,預測變數的有效範圍與生命週期。
- 展示「移動(Move)」、「克隆(Clone)」與「複製(Copy)」操作的差異。
🔹 第五課:結構體:管理相關資料
概述: 本課探討如何使用結構體(structs)將相關資料組合成自訂型別,以建立更具意義且有組織的程式碼。內容涵蓋各種結構體形式(傳統型、元組型、單位型)的定義與實例化、這些結構中資料擁有權的管理,以及透過衍生特性(如 Debug)與 impl 块定義的自訂方法來增強結構體功能。
學習成果:
- 使用命名欄位、簡潔語法與更新語法定義與實例化結構體。
- 区分傳統結構體、元組結構體與單位型結構體,並辨識其使用情境。
- 實作
Debug特性,並使用dbg!宏檢視結構體資料。
🔹 第六課:列舉型別與模式比對
概述: 本課探討 Rust 如何利用列舉型別(enums)透過枚舉其可能的變形來定義型別,提供比僅使用結構體更靈活的方式來分組相關常數與資料。內容涵蓋 Option 列舉在消除空指標錯誤中的關鍵角色,並展示 match 與 if let 架構如何提供強大且徹底的控制流程,以安全地處理複雜資料模式。
學習成果:
- 使用
impl块為列舉型別定義多種資料型別與方法。 - 解釋
Option<T>列舉相比傳統空值的安全部益。 - 建構徹底的
match表達式,綁定內部變形值,並使用萬用佔位符。
🔹 第七課:模組、套件與套件
概述: 本課探討 Rust 如何透過其模組系統組織程式碼,以提升可讀性與重用性。內容涵蓋模組樹的建立、隱私規則的應用以控制項目可見性,以及使用路徑與關鍵字如 use 與 pub 來管理作用域,並建立乾淨的 API。
學習成果:
- 使用模組與模組樹建立層次化結構的程式碼組織。
- 使用絕對路徑與相對路徑引用程式碼項目。
- 使用
pub關鍵字與隱私規則控制函式、模組與欄位的可見性。
🔹 第八課:常見集合
概述: 本課探討 Rust 標準程式庫中的集合,特別聚焦於向量(Vectors)、字串(Strings)與雜湊映射(Hash Maps)。這些資料結構儲存在堆上,可在執行時期動態調整大小,本課詳述了 Rust 擁有權與借用規則如何在管理這些值列表、UTF-8 文字與鍵值關聯時確保記憶體安全與效能。
學習成果:
- 使用
Vec<T>建立動態列表,並透過借用檢查器管理其生命週期。 - 使用
String類型操作 UTF-8 編碼文字,同時應對內部表示與串接的複雜性。 - 使用
HashMap<K, V>透過 Entry API 與自訂哈希考量,高效儲存與更新關聯資料。
🔹 第九課:錯誤處理策略
概述: 本課探討 Rust 強大的錯誤處理哲學,區分可恢復與不可恢復的錯誤。學生將學習使用 panic! 宏處理致命缺陷,使用 Result 類型處理可管理的失敗,並使用 ? 運算子簡化錯誤傳播。此外,課程還介紹如何利用 Rust 的型別系統強制資料驗證,維持程式完整性。
學習成果:
- 根據「錯誤狀態」標準,判斷何時使用不可恢復的
panic!或可恢復的Result。 - 使用反溯追蹤(backtraces)調試不可恢復錯誤的起源。
- 使用
?運算子實作錯誤傳播,並修改main函式以支援錯誤回傳。
🔹 第十課:泛型、特性和生命週期
概述: 本課探討 Rust 用於有效抽象的工具:泛型用於減少跨型別的程式碼重複,特徵(Traits)用於定義共享行為(介面),生命週期則用於確保記憶體安全而無需手動管理。這些功能共同讓開發者撰寫高效率、可重用的程式碼,並由編譯器驗證以防止懸掛參考與型別不匹配。
學習成果:
- 在函式、結構體與列舉中定義與使用泛型型別參數,以處理多種資料型別。
- 使用特徵與特徵界限(Trait Bounds)實作共享行為,以約束泛型型別。
- 使用生命週期註解與省略規則,管理參考有效性並滿足借用檢查器。
🔹 第十一課:撰寫自動化測試
概述: 本課探討 Rust 中自動化測試的實作與組織。內容涵蓋測試函式的結構要求、使用斷言巨集驗證邏輯,以及單元測試與整合測試之間的技術差異。學員也將了解如何控制 Rust 測試執行器的行為,以管理執行流程與顯示內容。
學習成果:
- 定義有效的 Rust 測試函式所需的結構與元資料。
- 實作等值檢查與恐慌狀態驗證,以確保程式碼可靠性。
- 設定測試執行器以平行或連續執行,並控制程式輸出的可見性。
🔹 第十二課:I/O 專案:命令列工具
概述: 本課引導開發者建構一個功能性的命令列工具(簡化版的 grep)在 Rust。內容聚焦於從單一檔案腳本轉換為模組化、生產就緒的二進位檔,強調記憶體安全的參數解析、檔案 I/O,以及將核心邏輯與命令列介面分離。學員將實作穩健的錯誤處理,並使用測試驅動開發(TDD)發展功能,同時透過環境變數管理應用程式狀態。
學習成果:
- 將命令列參數轉換為結構化的設定物件。
- 重構程式碼以符合「關注點分離」原則,適用於二進位專案。
- 使用測試驅動開發(TDD)週期實作核心邏輯,並加入生命週期註解。
🔹 第十三課:函式式特性:迭代器與閉包
概述: 本課探討 Rust 的函式式程式設計特性,特別聚焦於閉包與迭代器。閉包是匿名函式,能捕獲其環境,受 Fn 特性所規範;而迭代器則提供了惰性且高效的方式來處理項目序列。這兩項功能結合起來,使程式碼更具表現力,並遵循 Rust 的「零成本抽象」原則,通常能達到甚至超越傳統迴圈的效能。
學習成果:
- 定義匿名函式(閉包),並解釋它們如何透過借用或移動來捕獲環境中的變數。
- 區分三種
Fn特性(Fn、FnMut、FnOnce),並理解編譯器如何推論閉包型別。 - 使用
next方法實作Iterator特性,並區分消耗性適配器與迭代器適配器。
🔹 第十四課:進階 Cargo 與 Crates.io
概述: 本課探討 Rust 套件管理員 Cargo 及其生態系統 Crates.io 的進階功能。內容聚焦於透過發行設定檔優化建構、使用內嵌測試生成專業級文件,以及掌握公開 API 的架構。此外,課程還涵蓋套件的生命周期——從發佈與版本管理,到透過工作空間管理多套件專案,並擴展 Cargo 的原生功能。
學習成果:
- 設定發行設定檔,以平衡編譯速度與執行時期效能。
- 產生與驗證文件註解,作為使用者指南與自動化測試。
- 使用重新匯入(
pub use)設計方便的公開 API,將內部結構與外部使用分離。
🔹 第十五課:智慧指標
概述: 本課探討 Rust 的智慧指標——一種行為類似指標但攜帶額外元資料與功能的資料結構。我們專注於使用 Box<T> 管理堆分配,使用 Rc<T> 實現共享擁有權,以及透過內部可變性模式(Interior Mutability pattern)使用 RefCell<T> 突破嚴格的借用規則。此外,我們也介紹 Deref 與 Drop 特性,這些是智慧指標行為與資源清理的基礎。
學習成果:
- 使用
Box<T>實作遞迴資料結構,提供間接存取與已知記憶體大小。 - 使用
Deref與Drop特性自訂指標行為與資源管理。 - 透過結合
Rc<T>與RefCell<T>管理多重擁有者與執行時期檢查的可變性。
🔹 第十六課:無畏的並行處理
概述: 本課探討 Rust 的「無畏並行」理念,展示語言如何利用其擁有權與型別系統,將並行程式設計從執行時期的地雷陣轉變為編譯時期的確定性。內容涵蓋執行緒建立、透過訊息傳遞的安全通訊、使用互斥鎖(mutexes)管理共享狀態,以及定義執行緒安全的基礎特性。
學習成果:
- 使用
spawn與join建立與管理執行緒,並使用move關鍵字解決擁有權衝突。 - 使用
mpsc通道實作訊息傳遞並行處理,以安全地在執行緒間傳輸資料。 - 使用
Mutex<T>進行互斥,並使用Arc<T>進行執行緒安全的參考計數,以管理多執行緒間的共享狀態。
🔹 第十七課:在 Rust 中的物件導向程式設計
概述: 本課探討 Rust 如何實作核心物件導向程式設計(OOP)原則,特別聚焦於封裝與多型。內容詳細說明使用特徵物件(trait objects)處理異質集合的機制,以及靜態與動態分派之間的權衡。最後,將經典的狀態模式實現與更符合 Rust 風格的方法——直接將狀態與行為編碼至型別系統中——進行對比。
學習成果:
- 使用模組與可見性修飾符在 Rust 中實作封裝,隱藏內部狀態。
- 使用特徵物件達成多型,並理解靜態與動態分派的效能影響。
- 應用狀態模式管理複雜物件行為,並在狀態間切換。
🔹 第十八課:進階模式與比對
概述: 本課探討 Rust 模式比對系統的深度,超越簡單的 match 分支,深入複雜資料提取與控制流程。學員將掌握不可反駁與可反駁模式的差異,學習解構複雜巢狀結構,並運用進階語法如比對守衛與繫結,撰寫更具表現力與安全的程式碼。
學習成果:
- 區分不可反駁與可反駁模式,並將其正確應用於適當的 Rust 結構(如
let與if let)。 - 解構結構體、列舉與元組,將特定資料提取至局部變數。
- 使用進階模式語法,包括範圍、多重模式、忽略值,以及
@繫結以進行複雜條件比對。
🔹 第十九課:進階功能與不安全的 Rust
概述: 本課探討 Rust 的「超能力」,讓開發者能夠繞過某些編譯器限制,創建高度彈性的抽象。內容涵蓋使用不安全的 Rust 進行底層記憶體操作、進階特徵技術以處理複雜型別關係,以及宣告式與過程式巨集的強大元程式設計能力。
學習成果:
- 區分安全的 Rust 與需要原始指標操作與呼叫不安全函式的「不安全」超能力。
- 實作進階特徵模式,包括關聯型別、運算子重載、超特徵與新型別模式。
- 使用完全限定語法區分方法呼叫,並管理複雜型別如動態大小型別(DST)與型別別名。
🔹 第二十課:最終專案:多執行緒網路伺服器
概述: 本課指導開發者使用 Rust 的網路與並行原語,建構一個高性能的網路伺服器。內容涵蓋從基本的 TCP 監聽器過渡到利用自建執行緒池的複雜多執行緒系統。學員將學習管理低階資料流、實作基於工作人員的訊息傳遞以分配任務,並透過平順關機機制確保系統穩定。
學習成果:
- 建立與管理 TCP 連線:將伺服器綁定至本地埠,並處理傳入的字節資料流。
- 解析與回應 HTTP:讀取原始請求資料,並建構包含狀態行與 HTML 內容的合法 HTTP 回應。
- 設計自建執行緒池:使用
mpsc通道與同步原語(Arc、Mutex)將任務分派至有限數量的執行緒。
🔹 第二十一課:Rust 附錄:工具與參考
概述: 本課提供對 Rust 程式語言的完整技術參考,專注於其密集語法、自動化開發工具與演進式發行流程。學員將學習如何瀏覽 Rust 的符號密集語法,透過可推導的特性實作標準行為,並善用生態系工具,以維持高品質程式碼,並遵循語言「穩定而不僵化」的哲學。
學習成果:
- 識別與解讀語法:使用標準參考表格解碼 Rust 的運算子、路徑相關符號與泛型約束。
- 實作標準行為:使用
derive屬性自動實作Debug、Clone、Eq、Ord與Hash特性。 - 優化開發工作流程:使用
rustfmt、rustfix與Clippy按照社群標準格式化、修復與偵錯程式碼。