Rust 架構網站 03 所有權

閱讀時間約 3 分鐘
承接上一段,接下來到了一段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, 故可以被複製,這部分文檔是寫之後會介紹,所以我就之後再來看看吧。

    avatar-img
    2會員
    8內容數
    目前主要是是學習Rust,Rust是一種程式語言,用途頗廣泛,在很多大公司的軟體內部都可見Rust的身影,這個專題,主要紀錄我學習Rust的遇見的事,跟一些小作品。如果對軟體設計相關沒興趣的,基本上不用點開了。
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    rex chen的沙龍 的其他內容
    最開始學習一個語言肯定是從基礎語法開始,Rust還算滿幸運的有基礎語法的翻譯,這翻譯是在官方網站下推薦的,初步看起來沒什麼問題,在開發環境中我選擇visual studio code,基本的安裝,如果有問題的話,我相信網路上都找得到答案 第二章節就即開始基礎的Rust用法,非常有C語言的感覺,就是讓
    第一篇文章就先說說我的背景,並做一些開始接著寫文章前的介紹。
    最開始學習一個語言肯定是從基礎語法開始,Rust還算滿幸運的有基礎語法的翻譯,這翻譯是在官方網站下推薦的,初步看起來沒什麼問題,在開發環境中我選擇visual studio code,基本的安裝,如果有問題的話,我相信網路上都找得到答案 第二章節就即開始基礎的Rust用法,非常有C語言的感覺,就是讓
    第一篇文章就先說說我的背景,並做一些開始接著寫文章前的介紹。
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
    本文章闡述了信託法中受益人的資格及限制和其權利與義務。內容包括了享有信託利益、行使同意權、變更及終止信託、請求移轉信託財產、行使撤銷權和解除受託人之責任,給付報酬和補償受託人損失等。
    msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
    Thumbnail
    own 與「有;擁;有擁;擁有;權有;責有;權責有;物權;擁有物權;物權有擁;擁有的;擁有之;擭有;一己;自;自己;自己之;于自己;私己;私自;私人;本人;獨自;獨有;特有;私有;自有;所有;所能;權所有;全有;自力;獨力;物有于自;務有于自;坦白;招認;招;認;承認;自認;自招;自願;所願」等橋接
    Thumbnail
    經濟學的核心是什麼呢?當然就是交換東西嘛!不過我們要怎麼交換呢? 首先,那樣東西需要是「你的」,你總不能拿阿里山上的空氣跟我交換嘛!   但所謂「你的」或「我的」物品,就牽涉到「私有財產權」。 等等,我們先幫大家經濟學小科普一下~   西方歷史上最早對私有財產權制度的設計與保護,主要體現
    Thumbnail
    本文介紹了土地所有權的不同取得方式,包括原始取得和繼受取得。原始取得是指基於法律的規定而獨立且新生成的所有權,無需承受土地上原有的負擔。而繼受取得則是基於他人既存的權利而取得,同時需承受該土地上原有的負擔。文章中舉了一些相關的法條例子,並對原始取得和繼受取得進行了比較。
    Thumbnail
    權限管理=新增、修改、刪除+審核 通常,這種程式的設計會包含權限管理,其中包括現場修改、刪除等三大類功能。然而,根據經驗,我們還需要關注另一類功能,即審核權限。 審核不執行新增 審核權限通常不執行新增的動作,僅限於某些欄位的輸入。新增、修改、刪除這些操作基本上是容易理解的。也就是說,對於這個工
    Thumbnail
    前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
    Thumbnail
    這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
    本文章闡述了信託法中受益人的資格及限制和其權利與義務。內容包括了享有信託利益、行使同意權、變更及終止信託、請求移轉信託財產、行使撤銷權和解除受託人之責任,給付報酬和補償受託人損失等。
    msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
    Thumbnail
    own 與「有;擁;有擁;擁有;權有;責有;權責有;物權;擁有物權;物權有擁;擁有的;擁有之;擭有;一己;自;自己;自己之;于自己;私己;私自;私人;本人;獨自;獨有;特有;私有;自有;所有;所能;權所有;全有;自力;獨力;物有于自;務有于自;坦白;招認;招;認;承認;自認;自招;自願;所願」等橋接
    Thumbnail
    經濟學的核心是什麼呢?當然就是交換東西嘛!不過我們要怎麼交換呢? 首先,那樣東西需要是「你的」,你總不能拿阿里山上的空氣跟我交換嘛!   但所謂「你的」或「我的」物品,就牽涉到「私有財產權」。 等等,我們先幫大家經濟學小科普一下~   西方歷史上最早對私有財產權制度的設計與保護,主要體現
    Thumbnail
    本文介紹了土地所有權的不同取得方式,包括原始取得和繼受取得。原始取得是指基於法律的規定而獨立且新生成的所有權,無需承受土地上原有的負擔。而繼受取得則是基於他人既存的權利而取得,同時需承受該土地上原有的負擔。文章中舉了一些相關的法條例子,並對原始取得和繼受取得進行了比較。
    Thumbnail
    權限管理=新增、修改、刪除+審核 通常,這種程式的設計會包含權限管理,其中包括現場修改、刪除等三大類功能。然而,根據經驗,我們還需要關注另一類功能,即審核權限。 審核不執行新增 審核權限通常不執行新增的動作,僅限於某些欄位的輸入。新增、修改、刪除這些操作基本上是容易理解的。也就是說,對於這個工
    Thumbnail
    前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相