這份文件整理了在完成 Rustlings 練習過程中遇到的核心問題與詳細觀念解析,並附上實戰範例。
- mut 與不可變性:Rust 變數預設不可變。
let mut x = 5; x = 6; // OK
- Shadowing (遮蔽):
let x = "5"; let x = x.parse::<i32>().unwrap(); // 變更型別而不需換名
- 借用規則:
- 同一時間可有無限個不可變借用
&T。 - 同一時間只能有一個可變借用
&mut T。 - Auto-deref:存取欄位時
p.x會自動處理(*p).x。
- 同一時間可有無限個不可變借用
- String vs &str:
let s = "hello".to_string(); // Owned let slice = &s[..]; // Borrowed slice
- UTF-8 長度:
.len():位元組長度 (Bytes)。.chars().count():字元長度 (Characters)。
- Entry API:最優雅的更新方式。
let mut map = HashMap::new(); *map.entry("key").or_insert(0) += 1;
?運算子:成功則解開值,失敗則提早回傳。- map_err:翻譯錯誤型別。
s.parse::<i32>().map_err(|e| MyError::InvalidFormat)?
- 取出 Error:使用
match或if let Err(e) = res。
- impl Trait vs :
impl Trait:用於函式參數/回傳值的簡寫。<T: Trait>:用於結構體定義或複雜限制。
- derive:自動實作常用行為(Debug, Clone, Default)。
- 三大摺疊:
map:1 對 1 轉換。flat_map:1 對多並攤平(處理嵌套結構必備)。fold:多對 1 歸納。
- collect:將迭代器轉回集合,支援
Result<Vec<T>, E>(一錯全錯)。
- Arc<Mutex>:共享且可變資料的公式。
- mpsc (Channel):多端生產者,單端消費者。
let (tx, rx) = mpsc::channel(); let tx1 = tx.clone(); // 複製發送端 thread::spawn(move || tx1.send(10)); for val in rx { println!("{val}"); }
- Box:放在 Heap,解決遞迴型別大小問題。
- Rc / Arc:引用計數,支援「多人共同擁有」。
- Cow:寫入時克隆,追求效能優化(能借就不買)。
- as 運算子:顯性強制轉換。
let x = 10 as f64;。 - From / Into:保證成功的轉換。
- TryFrom / TryInto:可能失敗的轉換,回傳
Result。let r: u8 = u8::try_from(256i16).unwrap_err(); // 超出範圍
- AsRef / AsMut:廉價的引用轉引用。讓函式能接收任何「可以看作是某種引用」的型別。
// AsRef: 讓函式同時支援 String, &str 或 Path fn open_file<P: AsRef<Path>>(path: P) { let path = path.as_ref(); // ... } // AsMut: 常用於修改 Box 或內容物 fn num_sq<T: AsMut<u32>>(arg: &mut T) { let val = arg.as_mut(); *val *= *val; }
- 避免 check-then-unwrap:直接用
if let Some(x) = opt。 - 變數交換:使用
std::mem::swap(&mut a, &mut b)。 - 有效清空:使用
vec.clear()而不是重新賦值。
Generated by Gemini CLI - 2026-02-23