承接上一段,接下來到了一段Rust比較新奇的部分也是控制記憶體的部分AKA所有權。
所有權是在Rust處理記憶體的機制,記憶體由所有權系統管理,且編譯器會在編譯時加上一些規則檢查。
在這之前需要知道的部分
- 每個變數有一個所有者(owner)
- 同時間只能有一個所有者
- 只要擁有者離開作用域就會被釋放
看起來不是很像中文吧,我來直接用code展示一波
{
// s 在此處無效,因為它還沒宣告
let s = "hello"; // s 在此開始視為有效
// 使用 s
let c = s;
// 所有權轉移 c有效 , s無效
println!(s);
//將會報錯 因為所有權已經在c了
} // 此作用域結束, c 不再有效
這段code,感覺有學過其他程式語言的人會非常不習慣,我自己覺得這種記憶體回收機制有種化繁為簡的感覺,背後的邏輯跟用意可以點進文檔認真鑽研一下,透過這種機制可以省掉許多無意義地引用和追蹤。
這篇文檔中的東西有點多,重看一次也發現忘了一半了,顆顆。
關於函式的所有權
fn main() {
let s = String::from("hello"); // s 進入作用域
takes_ownership(s); // s 的值進入函式
// 所以 s 也在此無效
let x = 5; // x 進入作用域
makes_copy(x); // x 本該移動進函式裡
// 但 i32 有 Copy,所以 x 可繼續使用
} // x 在此離開作用域,接著是 s。但因為 s 的值已經被移動了
// 它不會有任何動作
fn takes_ownership(some_string: String) { // some_string 進入作用域
println!("{}", some_string);
} // some_string 在此離開作用域並呼叫 `drop`
// 佔用的記憶體被釋放
fn makes_copy(some_integer: i32) { // some_integer 進入作用域
println!("{}", some_integer);
} // some_integer 在此離開作用域,沒有任何動作發生
簡單翻譯
- 當變數被拿來當函式的參數時,就是一個所有權的轉移
- 轉移後的作用域,就在函式裡面。
而這段code中的i32擁有一個trit(特徵)叫做copy, 故可以被複製,這部分文檔是寫之後會介紹,所以我就之後再來看看吧。