Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rust 學習筆記與複習手冊 (Rustlings 攻略)

這份文件整理了在完成 Rustlings 練習過程中遇到的核心問題與詳細觀念解析,並附上實戰範例。

1. 變數與基本型別 (Variables & Types)

  • mut 與不可變性:Rust 變數預設不可變。
    let mut x = 5;
    x = 6; // OK
  • Shadowing (遮蔽)
    let x = "5"; 
    let x = x.parse::<i32>().unwrap(); // 變更型別而不需換名

2. 所有權與借用 (Ownership & Borrowing)

  • 借用規則
    • 同一時間可有無限個不可變借用 &T
    • 同一時間只能有一個可變借用 &mut T
    • Auto-deref:存取欄位時 p.x 會自動處理 (*p).x

3. 字串處理 (Strings)

  • String vs &str
    let s = "hello".to_string(); // Owned
    let slice = &s[..];         // Borrowed slice
  • UTF-8 長度
    • .len():位元組長度 (Bytes)。
    • .chars().count():字元長度 (Characters)。

4. 集合與 HashMaps

  • Entry API:最優雅的更新方式。
    let mut map = HashMap::new();
    *map.entry("key").or_insert(0) += 1;

5. 錯誤處理 (Error Handling)

  • ? 運算子:成功則解開值,失敗則提早回傳。
  • map_err:翻譯錯誤型別。
    s.parse::<i32>().map_err(|e| MyError::InvalidFormat)?
  • 取出 Error:使用 matchif let Err(e) = res

6. 泛型與 Trait (Generics & Traits)

  • impl Trait vs
    • impl Trait:用於函式參數/回傳值的簡寫。
    • <T: Trait>:用於結構體定義或複雜限制。
  • derive:自動實作常用行為(Debug, Clone, Default)。

7. 迭代器 (Iterators)

  • 三大摺疊
    • map:1 對 1 轉換。
    • flat_map:1 對多並攤平(處理嵌套結構必備)。
    • fold:多對 1 歸納。
  • collect:將迭代器轉回集合,支援 Result<Vec<T>, E>(一錯全錯)。

8. 多執行緒與通訊 (Concurrency)

  • 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}"); }

9. 智慧指標 (Smart Pointers)

  • Box:放在 Heap,解決遞迴型別大小問題。
  • Rc / Arc:引用計數,支援「多人共同擁有」。
  • Cow:寫入時克隆,追求效能優化(能借就不買)。

10. 型別轉換 (Conversions)

  • 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;
    }

11. Clippy 最佳實踐 📎

  • 避免 check-then-unwrap:直接用 if let Some(x) = opt
  • 變數交換:使用 std::mem::swap(&mut a, &mut b)
  • 有效清空:使用 vec.clear() 而不是重新賦值。

Generated by Gemini CLI - 2026-02-23

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages