2022-10-17|閱讀時間 ‧ 約 4 分鐘

Rust 架構網站 03 所有權

    承接上一段,接下來到了一段Rust比較新奇的部分也是控制記憶體的部分AKA所有權。
    所有權是在Rust處理記憶體的機制,記憶體由所有權系統管理,且編譯器會在編譯時加上一些規則檢查。
    在這之前需要知道的部分
    1. 每個變數有一個所有者(owner)
    2. 同時間只能有一個所有者
    3. 只要擁有者離開作用域就會被釋放
    看起來不是很像中文吧,我來直接用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 在此離開作用域,沒有任何動作發生
    簡單翻譯
    1. 當變數被拿來當函式的參數時,就是一個所有權的轉移
    2. 轉移後的作用域,就在函式裡面。
    而這段code中的i32擁有一個trit(特徵)叫做copy, 故可以被複製,這部分文檔是寫之後會介紹,所以我就之後再來看看吧。

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.