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
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    上班空閒無聊?試試這款新推出的放置農夫遊戲Rusty's Reitrement!透過建立全自動化的農場,無需獨立視窗,完全不影響上班裝忙,適合薪水小偷的上班族。
    Thumbnail
    放置型農場經營遊戲《魯斯蒂的退休生活 Rusty's Retirement》遊戲介紹及心得。
    Thumbnail
    本文介紹了作者使用 Rust 重寫的一個專案,目的是為了在樹梅派上取得 LAN IP,並透過 Telegram 機器人發送訊息。作者首先提到在樹梅派上使用 Python 版本時遇到的問題,之後才開始討論為什麼選擇了 Rust 重寫的理由。
    Thumbnail
    非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
    Thumbnail
    先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
    在開發 Rust 或是使用 Rust 編寫的 CLI 工具時,常會看見類似下方的錯誤訊息: note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 簡單寫一下該怎麼做。
    Thumbnail
    對於剛學習 Rust 的人來說,最一開始不是看 Youtube 的影片或是跟著 Rust 官方手冊 The Book 學習,這邊來推薦一個練習 Rust 的專案,名為 rustlings。 rustlings 包含著一些簡單的題目,來讓你更習慣閱讀或編寫 Rust 程式碼。該專案會在每道題目上給予
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    上班空閒無聊?試試這款新推出的放置農夫遊戲Rusty's Reitrement!透過建立全自動化的農場,無需獨立視窗,完全不影響上班裝忙,適合薪水小偷的上班族。
    Thumbnail
    放置型農場經營遊戲《魯斯蒂的退休生活 Rusty's Retirement》遊戲介紹及心得。
    Thumbnail
    本文介紹了作者使用 Rust 重寫的一個專案,目的是為了在樹梅派上取得 LAN IP,並透過 Telegram 機器人發送訊息。作者首先提到在樹梅派上使用 Python 版本時遇到的問題,之後才開始討論為什麼選擇了 Rust 重寫的理由。
    Thumbnail
    非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
    Thumbnail
    先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
    在開發 Rust 或是使用 Rust 編寫的 CLI 工具時,常會看見類似下方的錯誤訊息: note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 簡單寫一下該怎麼做。
    Thumbnail
    對於剛學習 Rust 的人來說,最一開始不是看 Youtube 的影片或是跟著 Rust 官方手冊 The Book 學習,這邊來推薦一個練習 Rust 的專案,名為 rustlings。 rustlings 包含著一些簡單的題目,來讓你更習慣閱讀或編寫 Rust 程式碼。該專案會在每道題目上給予