Rust 架構網站 03 所有權

更新於 發佈於 閱讀時間約 4 分鐘

承接上一段,接下來到了一段Rust比較新奇的部分也是控制記憶體的部分AKA所有權。

raw-image


Rust 程式設計語言

所有權是在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
留言分享你的想法!
avatar-img
rex chen的沙龍
2會員
8內容數
目前主要是是學習Rust,Rust是一種程式語言,用途頗廣泛,在很多大公司的軟體內部都可見Rust的身影,這個專題,主要紀錄我學習Rust的遇見的事,跟一些小作品。如果對軟體設計相關沒興趣的,基本上不用點開了。
rex chen的沙龍的其他內容
2023/04/30
非本科學習Systems Programming的難處 轉職成工程師後,一直認為自己對相關知識的認識有所不足,特別是系統編程和底層知識。對於非科系學生來說,這些概念可能會很困難,但對於應用層面的編程卻有很大的幫助。最近我正在閱讀一本關於系統編程的書籍——《Rust in Action》。在這本書中,
Thumbnail
2023/04/30
非本科學習Systems Programming的難處 轉職成工程師後,一直認為自己對相關知識的認識有所不足,特別是系統編程和底層知識。對於非科系學生來說,這些概念可能會很困難,但對於應用層面的編程卻有很大的幫助。最近我正在閱讀一本關於系統編程的書籍——《Rust in Action》。在這本書中,
Thumbnail
2023/04/03
自從ChatGPT一出 ,現在跑出一堆AI技術工具,真的是感覺自己工作輕鬆很多又有點覺得自己快失業。其實ChatGPT已經可以寫一些簡單的程式了,而且寫錯跟他講一下,他還會立馬給你一版更正過的,只能說邊用邊嘖嘖稱奇(題外話: 不過也會有你怎麼講,他都一直寫錯的情況啦。顆顆)
Thumbnail
2023/04/03
自從ChatGPT一出 ,現在跑出一堆AI技術工具,真的是感覺自己工作輕鬆很多又有點覺得自己快失業。其實ChatGPT已經可以寫一些簡單的程式了,而且寫錯跟他講一下,他還會立馬給你一版更正過的,只能說邊用邊嘖嘖稱奇(題外話: 不過也會有你怎麼講,他都一直寫錯的情況啦。顆顆)
Thumbnail
2022/11/27
近期已經進去了一個看完語法,進去實作的階段,自然需要去挑選一個適合的環境來開發了。 原本使用的VS code,基本的使用上沒什麼問題,只是每當我要裝一些套件時就會報錯,相信花點時間,這些錯都可以解決,但我突然轉念一想,不如換個環境來寫寫看吧。於是就把矛頭轉向系統內建的Vim了。
Thumbnail
2022/11/27
近期已經進去了一個看完語法,進去實作的階段,自然需要去挑選一個適合的環境來開發了。 原本使用的VS code,基本的使用上沒什麼問題,只是每當我要裝一些套件時就會報錯,相信花點時間,這些錯都可以解決,但我突然轉念一想,不如換個環境來寫寫看吧。於是就把矛頭轉向系統內建的Vim了。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
Thumbnail
先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
Thumbnail
,先來分享一下封裝是怎麼一回事。 一、封裝(Encapsulation) 封裝就是把一些功能的處理程序或是資料包起來,也對於程式碼做權限的設定做一層保護的機制,這是為了防止程式碼被竄改,所以有了封裝可以保障我們資料的隱密性,甚至封裝也是一種將一些處理程序隱藏起來,讓使用者使用時可以更加單純。 1.什
Thumbnail
,先來分享一下封裝是怎麼一回事。 一、封裝(Encapsulation) 封裝就是把一些功能的處理程序或是資料包起來,也對於程式碼做權限的設定做一層保護的機制,這是為了防止程式碼被竄改,所以有了封裝可以保障我們資料的隱密性,甚至封裝也是一種將一些處理程序隱藏起來,讓使用者使用時可以更加單純。 1.什
Thumbnail
一、存取修飾詞public / private / protected / internal 二、參數修飾詞ref / in / out >>>>>由於我們在寫程式時,會去宣告一些變數、常數相關識別詞,並且在class(類別)中會寫一些事情或動作讓程式去運行,然而這個概念就是去定義對於我們所寫的內容
Thumbnail
一、存取修飾詞public / private / protected / internal 二、參數修飾詞ref / in / out >>>>>由於我們在寫程式時,會去宣告一些變數、常數相關識別詞,並且在class(類別)中會寫一些事情或動作讓程式去運行,然而這個概念就是去定義對於我們所寫的內容
Thumbnail
承接上一段,接下來到了一段Rust比較新奇的部分也是控制記憶體的部分AKA所有權。 Rust 程式設計語言 所有權是在Rust處理記憶體的機制,記憶體由所有權系統管理,且編譯器會在編譯時加上一些規則檢查。 在這之前需要知道的部分 每個變數有一個所有者(owner) 同時間只能有一個所有者 只要擁有者
Thumbnail
承接上一段,接下來到了一段Rust比較新奇的部分也是控制記憶體的部分AKA所有權。 Rust 程式設計語言 所有權是在Rust處理記憶體的機制,記憶體由所有權系統管理,且編譯器會在編譯時加上一些規則檢查。 在這之前需要知道的部分 每個變數有一個所有者(owner) 同時間只能有一個所有者 只要擁有者
Thumbnail
最開始學習一個語言肯定是從基礎語法開始,Rust還算滿幸運的有基礎語法的翻譯,這翻譯是在官方網站下推薦的,初步看起來沒什麼問題,在開發環境中我選擇visual studio code,基本的安裝,如果有問題的話,我相信網路上都找得到答案 第二章節就即開始基礎的Rust用法,非常有C語言的感覺,就是讓
Thumbnail
最開始學習一個語言肯定是從基礎語法開始,Rust還算滿幸運的有基礎語法的翻譯,這翻譯是在官方網站下推薦的,初步看起來沒什麼問題,在開發環境中我選擇visual studio code,基本的安裝,如果有問題的話,我相信網路上都找得到答案 第二章節就即開始基礎的Rust用法,非常有C語言的感覺,就是讓
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
Thumbnail
使用者自訂的資料型別
Thumbnail
使用者自訂的資料型別
Thumbnail
使用者自訂的資料型別
Thumbnail
使用者自訂的資料型別
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News