6.2 常見坑與清潔整理#
初學者最常踩的坑#
Rust 的學習曲線大部分來自「編譯器在擋你」。這些坑每個人都踩過——認識它們能少走很多冤枉路:
坑一:被搬移之後還想用#
let s = String::from("hello");
let t = s;
println!("{}", s); // ← 編譯錯誤:value moved
解法:要嘛 s.clone()(明確的複製成本),要嘛改用借用 &s(複習 2.2 節)。
坑二:同時有多個可變借用#
let mut v = vec![1, 2, 3];
let a = &mut v;
let b = &mut v; // ← 編譯錯誤:a 還在用
a.push(4);
解法:把借用範圍縮小——用完 a 之後再借 b(NLL 會自動判斷)。需要同時操作,表示資料結構該重新設計。
坑三:函式最後一行多寫了分號#
fn add(a: i32, b: i32) -> i32 {
a + b; // ← 編譯錯誤:mismatched types
}
解法:刪掉分號(複習 2.1 節)。
坑四:Option/Result 沒處理就直接用#
let n = find_user(42);
println!("{}", n.to_uppercase()); // ← 編譯錯誤:Option 沒有這個方法
解法:match、if let、或 unwrap_or 系列(複習 1.2 節)。
坑五:debug 模式下量測效能#
cargo run # ← 慢幾十倍,benchmark 結論錯誤
cargo run --release # ✓ 效能要在 release 下量測
坑六:編譯錯誤只看第一行#
Rust 錯誤訊息的精華在後面——通常直接告訴你「這樣改就行」:
cargo check 2>&1 | less # 完整閱讀錯誤訊息
清潔整理:target/ 目錄#
Rust 唯一會暴漲的空間是 target/(建構產物,切換 branch、改依賴後會累積舊產物):
du -sh target/ # 看看吃了多少(大專案可能數十 GB)
cargo clean # 全部清除(下次 build 要重新編譯)
| 情境 | 解法 |
|---|---|
| 磁碟滿了 | cargo clean,或刪掉舊專案的 target/ |
| 切 branch 後行為怪怪的 | cargo clean 後重新建構 |
| 多專案共用建構快取 | workspace(共用 target/,複習 4.3 節) |
| IDE 卡卡 | 確認 rust-analyzer 有在跑,別同時開多個 |
工具推薦:
cargo install cargo-cache提供cargo cache指令,方便管理~/.cargo下的依賴快取。
全書總結:Rust 極最小知識地圖#
flowchart TD
A[第一章 概念<br/>效能 + 安全 + 三大心智模型] --> B[第二章 語言基礎<br/>不可變 / 所有權 / struct enum]
B --> C[第三章 抽象<br/>泛型 / Trait / Result]
C --> D[第四章 Cargo<br/>check / run / build / 依賴]
D --> E[第五章 測試<br/>單元 / 整合 / 文件測試]
E --> F[第六章 速查<br/>10 指令 + 常見坑]- 三大心智模型:所有權、Option(無 null)、Result(無例外)
- 語言基礎:預設不可變、Move 與借用鐵律、struct/enum + match 窮盡性
- 抽象:泛型 + trait bound、靜態分發優先、
?傳播錯誤 - Cargo:check → test → fmt + clippy 的開發循環,Cargo.lock 鎖版本
- 測試:單元測試同檔案、整合測試測 pub API、文件範例即測試
- 日常:10 個指令 + 六大常見坑
你已經掌握了 Rust 的最小可行知識。剩下的 20%(生命週期標註、非同步 tokio、unsafe、巨集、智慧指標),等實務需要時再學也不遲。
想一想#
- 六個常見坑中,你已經踩過哪幾個?解法記住了嗎?
- 把你的 Rust 專案整理一次:跑
cargo fmt、cargo clippy、補上缺失的測試。 - 下一步想學哪一個進階主題?為什麼?(提示:跟著實務需要走,不要為學而學)