Day 1:所有權三大規則
學習目標
- 背熟所有權三大規則
- 理解「所有權轉移(move)」
- 知道 move 對變數效力的影響
今日重點
三大規則(必背)
- 每個值都有一個變數,稱為它的「擁有者(owner)」
- 同一時間只能有一個擁有者
- 擁有者**離開範圍(scope)時**,值會被**丟棄並釋放記憶體**
所有權轉移(Move)
let s1 = String::from("hello");
let s2 = s1; // s1 的所有權「移動」到 s2
// println!("{}", s1); // 錯誤!s1 已無效(已被 move)
println!("{}", s2); // 正確
String 的 s1 = s2 不是複製內容,而是**移動**。s1 之後不再有效。
為什麼不複製?
- 若每次都深拷貝整個字串,效能很差
- Rust 選擇「移動所有權 + 編譯期檢查」,避免懸垂指標,又保有零成本
離開範圍
{
let s = String::from("hello");
} // s 在這裡離開範圍,記憶體自動釋放
練習
- 試著在 move 之後印出 s1,讀懂編譯錯誤訊息。
- 用
clone() 保留兩份,比較跟 move 的差別。
let s3 = String::from("hello");
let s4 = s3.clone(); // 深拷貝,兩者都有效
println!("{} and {}", s3, s4);
自我檢查
深入連結
- The Book 第 4 章「Ownership」