--- tags: RUST LANGUAGE --- # [Crust of Rust](/jLixlQ1ASZaBHqCBDFu1Iw): 筆記說明 ## 筆記說明 Crust of Rust 系列是根據 [Jon Gjengset](https://thesquareplanet.com/) 的直播所記錄下的學習筆記,他透過實作來加深您對 Rust 程式的理解,他不會一開始就實作出最終版本,而是漸進式的實作的帶著您實作,這樣做的好處是能幫助您建立程式設計師應有的思維並解決問題,他還會帶您閱讀官方文件來協助您打下更扎實的基礎。本系列適合已經有編寫或閱讀過 Rust 相關書籍的讀者,若有 C 語言開發相關的經驗,將更能夠理解 Rust 編譯器嘗試解決的問題究竟是什麼。 ## Crust of Rust * [Lifetime Annotations](/F8zEmei9Q6KmwOnQ5H1Vug) (2023.12) * 多個的生命週期使用情境 * 避免字串造成的記憶體配置所帶來的效能衝擊 * 為不同的資料型別實作 trait * [Declarative Macros](/0WPhprK_Rv2_W3QBkWx2gQ) (2023.12) * 巨集的基礎使用 * Hygiene 避免巨集內部變數影響到巨集外部變數 * 模式與樣板的重複用法 * 避免因為 Vec 大小一直改變而重新配置記憶體的解決辦法 * 尾隨逗號的處理方法 (包含遞迴呼叫巨集版本) * 陣列元素的計數技巧 (包含遞迴呼叫巨集版本) * [Iterators](/RJ5zG5xuTN2e7bYT6-AJWQ) (2024.01) * Iterator, IntoIterator 介紹 * 實作 flatten 功能 * 透過讓 flatten 支援雙向走訪了解巢狀 bound 的使用 * 先 flatten 再走訪的缺點分析 * [Smart Pointers and Interior Mutability](/HpIQAfztQjOPyb0u1-BB2g) (2024.01) * 介紹 interior mutability * 實作 Cell 型別理解如何限制程式只能單一執行緒執行。 * RefCell 型別的狀態轉換 (使用 Cell 限制程式單一執行緒執行) * Rc 參考計數設值的細節 (使用 Cell 限制程式單一執行緒執行) * NonNull 指標, PhantomData 型別用途以及 Drop Check 機制 * Cow 型態的使用時機 * [Channels](/4fdUqz6NTaSOJ46xStlQtg) (2024.01) * 實作 MPSC - Mutex, Condvar, Arc * 處理 0 Sender/Receiver 的方法 * 批次接收資料最佳化 * Channel flavors - Synchronous, Asynchronous, Rendezvous 以及 Oneshot * Future-aware channels * [Sorting Algorithms](/vWR6QRvOSGKvDba1opOqfg) (2024.01) * 實作 Bubble sort, Insertion sort, Selection sort 以及 Quick sort * 為測試元素實作 PartialEq, PartialOrd, Ord * Benchmark 比較次數以及執行時間 * [Subtyping and Variance](/3GuLI4EiRtWlu8lB0plxlg) (2024.01) * subtyping 的定義 * 透過實作 strtok 函式理解 covariance 以及 invaraince * 透過簡單的函式理解 contravariance * Variance, PhantomData 與 drop check 之間的關係 * [The Drop Check](/Uoas5s4pQZKxD4eza0tR5A) (2024.01) * 實作 Boks 理解 drop check 機制 (dropck_eyepatch, may_dangle) * 如何讓自定義型別為 covaraint in T (NonNull) * [Atomics and Memory Ordering](/2HDiZxKQQU-J3Cq7AMVIhw) (2024.02) * 實作 Mutex 理解 MESI protocol 以及 happens-before * `compare_exchange` vs. `compare_exchange_weak` * Ordering::SeqCst 說明 * volatile 的實際用途 * [Dispatch and Fat Pointers](/jZvp4MkFRkmZnpV0d7ajGA) (2024.02) * 泛型參數的 Monomorphization * Sized 與 not Sized 對程式帶來的影響 * Static Dispatch 以及 Dynamic Dispatch (包含 vtable 的介紹) * Object safe 的必要條件 * 如何使 trait 物件為 Partial Object Safety * trait 物件的限制以及解決方法 * [async/await](/XaQqY2FySgWAQa-U61sxCw) (~~2024.02~~) * 施工中 * [Functions, Closures, and Their Traits](/NbkPk5OJT2K7urueGqzxVQ) (2024.02) * Function item 與函式指標的差異 * capturing/ non-capturing closure 的差異 * static/ non-static closure 的差異 * `Fn`/ `FnMut`/ `FnOnce` trait 的差異 * [Send, Sync, and their implementors](/sM8MtsewRwCkeT4vb2V2lA) (2024.02) * 藉由簡易版的 Rc 來理解 Send * Send 與 Sync 之間的差異 * Negative 實作的用途 * 檢視 Send 和 Sync 的一些 implementors * [Build Scripts and Foreign-Function Interfaces (FFI)](/W_kva_H_RYaW8DTxHLTAQw) (2024.02) * 透過 libsodium/ libssh2-sys/libgit2-sys crate 了解建置腳本功能 * 測試 bindgen 以及 pkg-config 功能 * 實作 libsodium-sys 了解 Rust 如何使用 C 外部函式 * [std::collections](/ht8msrixQGiQM-cifPQ-xg) (2024.02) * Sequences: Vec, VecDeque, LinkedList * Sets: HashSet, BTreeSet * Maps: HashMap, BTreeMap * Misc: BinaryHeap * 探討 Option, Result, `()` 是否為 colleciton 類型 ## 筆記編排 * 斜體字 (*Italic*) 代表新術語、URLs、email 地址、檔名,與副檔名。 * 定寬字 (`Constant width`) 代表程式,也在文章中代表程式元素,例如變數或函式名稱、資料庫、資料型別、環境變數、陳述式,與關鍵字。 * 定寬粗體字 (**Constant width bold**) 代表應由使用者親自輸入的命令或其他文字。 * 定寬斜體 (*`Constant width italic`*) 這種文字應換成使用者提供的值,或由程式程式脈絡決定的值。 ::: info :bulb: 該圖示代表提示或建議。 ::: ::: success :pencil2: 該圖示代表一般註釋。 ::: ::: warning :warning: 該圖示代表警告或注意。 :::