深入 Rust 所有權系統
記憶體管理是系統程式語言的核心戰場。C 把一切交給程式設計師,Java 把一切交給 GC,而 Rust 選擇了第三條路:在編譯期靜態驗證記憶體安全。這不是取捨,而是範式轉移。
Ownership is Rust's most unique feature. 所有權是 Rust 最獨特的特性。
三條基本規則
- 每個值都有一個擁有者(owner)
- 同一時間只能有一個擁有者
- 擁有者離開作用域時,值即被釋放
移動語義示範
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1 的所有權移動到 s2
// println!("{}", s1); // 編譯錯誤:s1 已失效
println!("{}", s2);
}
借用與生命週期
借用檢查器(borrow checker)確保引用永遠有效1。規則很簡單:同一時間可以有多個不可變借用,或一個可變借用,但不能同時存在2。
與其他語言比較
| language | strategy | cost |
|---|---|---|
| C/C++ | 手動管理 | 懸空指標與洩漏風險 |
| Java/Go | 垃圾回收 | GC 暫停與記憶體開銷 |
| Rust | 所有權系統 | 編譯期學習成本 |
實務工作流程
使用 rustup 安裝工具鏈,完成後按 Ctrl + ` 開啟終端機驗證版本。
cargo build 會執行完整的借用檢查,錯誤訊息包含修正建議。
遇到 E0382(value moved)時,優先考慮借用而非 clone。
各平台安裝差異
透過官方安裝程式或 winget 安裝,需另外安裝 MSVC Build Tools 作為連結器。
透過 rustup 或 Homebrew 安裝,需先安裝 Xcode Command Line Tools。
透過發行版套件管理器或 rustup 安裝,通常已內建 gcc 可直接作為連結器。
graph TD
A[宣告變數] --> B[取得所有權]
B --> C{離開作用域?}
C -->|是| D[自動呼叫 Drop]
C -->|否| E[繼續持有]
附錄:行內節點測試
科學記號:E = mc2,化學式:H2O。
換行測試:第一行
第二行。
連結推導測試:造訪Rust 原始碼,回報問題請寄回報信箱,或撥打技術支援。
逃逸測試:字面輸出 @bold 不會被解析;整段跳過:這裡的 @mark[hello] 保持原樣。
不成對括號跳脫測試:字面右括號 ] 與字面 @@] 序列都能輸出。
不成對左括號跳脫測試:缺少開頭方括號的字面右括號 ] 測試,以及缺少結尾方括號的字面左括號 [ 測試。
巢狀嵌套測試
粗體外層包含藍色標記與斜體加底線的組合。
- See The Rust Book, Ch. 4.2. ↩
- 這條規則在編譯期防止了資料競爭(data race),無需執行期鎖。 ↩