owned this note
owned this note
Published
Linked with GitHub
---
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: 該圖示代表警告或注意。
:::