學習筆記九——Rust所有權機制

🦀 Rust 所有權機制

📚 目錄

  1. 什么是值類型和引用類型?值語義和引用語義?
  2. 什么是所有權?為什么 Rust 需要它?
  3. 所有權的三大原則(修正版)
  4. 移動語義 vs 復制語義:變量賦值到底發生了什么?
  5. 綁定和作用域:值的“活多久”與“誰管它”
  6. 引用和借用:本質是什么?為什么這么設計?
  7. 借用的三條規則(逐條解釋+示例)
  8. 生命周期:引用能用多久?
  9. 生命周期參數:為什么需要?怎么用?
  10. Rust 的借用檢查器是怎么幫你“兜底”的?
  11. 總結與學習建議

1?? 什么是值類型和引用類型?值語義和引用語義?

?? 值類型(Value Type)

變量里存的是實際的數據。

let x = 10;  // x 是 i32 值類型

?? 引用類型(Reference Type)

變量里存的是指向其他數據的“地址”。

let x = 10;
let y = &x;  // y 是對 x 的引用,類型是 &i32

🔍 值語義 vs 引用語義

概念解釋示例
值語義每次賦值都復制/移動數據本身let b = a;
引用語義多個變量共享同一個值的訪問權(指針)let r = &a;

2?? 什么是所有權?為什么 Rust 需要它?

在 Rust 中,所有權機制用于管理內存,確保內存安全,不靠垃圾回收(GC),也不手動 free

通俗理解:誰擁有這個數據,誰負責清理它。

  • 避免懸空引用
  • 自動釋放資源(變量離開作用域)
  • 避免多線程數據競爭

3?? Rust 所有權的三大原則

  1. 每個值在任意時刻只能有一個所有者。
  2. 當所有者離開作用域,值會被自動釋放。
  3. 一個值只能有一個可變引用,或任意多個不可變引用,但不能同時存在。
let a = String::from("hello");
let b = a;        // a 的所有權移動到 b
// println!("{}", a); // ? 報錯:a 被移動了

4?? 移動語義 vs 復制語義

let a = 10;        // a 是 Copy 類型
let b = a;         // 自動復制,a 仍然有效let s1 = String::from("Hi");
let s2 = s1;       // 所有權移動,s1 失效

想要深拷貝,用 .clone()

let s1 = String::from("Rust");
let s2 = s1.clone(); // ? s1 仍有效

5?? 綁定和作用域

變量只在其“作用域”內有效:

{let name = String::from("Tom");println!("{}", name);
} // name 離開作用域,自動釋放

作用域由 {} 包圍,函數、if、match、循環等都會創建作用域。


6?? 引用和借用:到底有什么區別?

? 本質解釋:

  • 引用(reference)是“變量的地址”(通過 & 獲取)
  • 借用(borrowing)是“使用別人的值但不擁有它”的行為

🧠 所以:“引用”是工具,而“借用”是動作

舉例說明:

let s = String::from("Rust");
let r = &s; // 你用 &s 創建了一個“引用”,這就是“借用了 s 的值”
概念通俗解釋Rust 表現形式
引用地址&a&mut a
借用臨時借東西不擁有let r = &a

7?? 借用的三條規則(逐條解釋+示例)

規則 1:借用不能比原值活得更久(生命周期限制)

fn dangle() -> &String {let s = String::from("oops");&s // ? s 被釋放,引用懸空
}

規則 2:可變借用具有獨占性

let mut s = String::from("hi");
let r1 = &mut s;
// let r2 = &mut s; // ? 同時只能有一個可變借用

規則 3:有不可變借用時,不能再借出可變引用

let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
// let r3 = &mut s; // ? 報錯:不能混合借用

📌 原則:只讀可以多個,可寫只能一個,不能混用。


8?? 生命周期:引用能用多久?

生命周期就是引用在內存中能活多久

Rust 不允許引用指向已釋放的內存:

fn dangle() -> &String {let s = String::from("hi");&s // ? 返回了已經釋放的 s
}

9?? 生命周期參數:為什么需要?怎么用?

當函數的參數和返回值中有引用,Rust 要你說明它們“誰活得久”。這就是“生命周期參數”。

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
}

解釋:

  • <'a> 是生命周期參數
  • xy、返回值 都必須活得跟 'a 一樣久

📌 一般來說,編譯器可以自動推斷。但在函數返回引用時,必須顯式寫出生命周期參數。


🔟 Rust 的借用檢查器是怎么幫你的?

Rust 有一個非常強大的“借用檢查器”(Borrow Checker),會在編譯階段檢查:

  • 有沒有懸空引用?
  • 可變引用有沒有被別名?
  • 是否混用了可變和不可變引用?
  • 生命周期是否符合規則?

🧠 你寫錯了引用規則,Rust 不會讓你運行,而是直接編譯失敗。

? 借用檢查器就是 Rust 安全的“守門員”!它會嚴格替你把關內存安全。


🔚 總結與學習建議

概念通俗解釋
所有權誰擁有值,誰負責清理
移動所有權轉移,原值失效
復制創建副本,兩個變量互不影響
借用臨時訪問但不擁有,分可變/不可變
引用表示地址,借用的語法工具
生命周期引用能活多久(不能活得比原值久)
生命周期參數顯式告訴編譯器“誰和誰一樣久”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76617.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cocos Creator Shader入門實戰(八):Shader實現圓形、橢圓、菱形等頭像

引擎&#xff1a;3.8.5 您好&#xff0c;我是鶴九日&#xff01; 回顧 Shader的學習是一條漫長的道路。 理論知識的枯燥無味&#xff0c;讓很多人選擇了放棄。然而不得不說&#xff1a;任何新知識、新領域的學習&#xff0c;本身面臨的都是問題&#xff01; 互聯網和AI給了我…

深入理解計算機操作系統(持續更新中...)

文章目錄 一、計算機系統漫游1.1信息就是位上下文 一、計算機系統漫游 1.1信息就是位上下文 源程序實際上就是一個由值0和1組成的位&#xff08;又稱為比特&#xff09;&#xff0c;八個位被組織成一組&#xff0c;稱為字節。每個字節表示程序中的某些文本字符 大部分現代計…

YOLO V8的??Anchor-Free??、??解耦頭(Decoupled Head)、損失函數定義(含??Varifocal Loss)

YOLOv8 的 ??Anchor-Free?? 設計摒棄了傳統 YOLO 系列中依賴預定義錨框&#xff08;Anchor Boxes&#xff09;的機制&#xff0c;轉而直接預測目標的中心點和邊界框尺寸。這種設計簡化了模型結構&#xff0c;降低了超參數調優的復雜度提升了檢測速度和精度。以下是其核心實…

QuarkPi-CA2 RK3588S卡片電腦:6.0Tops NPU+8K視頻編解碼+接口豐富,高性能嵌入式開發!

QuarkPi-CA2 RK3588S卡片電腦&#xff1a;6.0Tops NPU8K視頻編解碼接口豐富&#xff0c;高性能嵌入式開發&#xff01; 芯片框架 視頻介紹 https://www.bilibili.com/video/BV1btdbYkEjY 開發板介紹 核心升級&#xff0c;產品炸裂 QuarkPi-CA2卡片電腦搭載瑞芯微RK3588S芯片…

【響應式編程】Reactor 常用操作符與使用指南

文章目錄 一、創建操作符1. just —— 創建包含指定元素的流2. fromIterable —— 從集合創建 Flux3. empty —— 創建空的 Flux 或 Mono4. fromArray —— 從數組創建 Flux5. fromStream —— 從 Java 8 Stream 創建 Flux6. create —— 使用 FluxSink 手動發射元素7. generat…

從靜態綁定驅動模型到現代設備模型 —— 一次驅動架構的進化之旅

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 從靜態綁定驅動模型到現代設備模型 在 Linux 內核的發展歷程中&#xff0c;設備驅動結構經歷了從"硬編碼 手動注冊"的早期實現方式&#xff0c;到"設備模型統一管理&qu…

Embedding質量評估、空間塌縮、 Alignment Uniformity

Embedding質量的評估和空間塌縮的解決是自然語言處理&#xff08;NLP&#xff09;和推薦系統領域的關鍵問題。以下是綜合多篇研究的總結&#xff1a; 一、Embedding質量評估方法 基準測試與任務指標 MTEB/C-MTEB&#xff1a;使用多語言或中文的基準測試集&#xff08;如58個數據…

批量給dwg顯示略縮圖_c#插件實現(com)

如果&#xff0c;cad文件無略縮圖&#xff1a; AutoCAD2021版本以上&#xff0c;命令行輸入"netload "加載此dll插件&#xff0c;然后輸入 “lst”&#xff0c;選擇文件夾&#xff0c;即可一鍵實現給dwg增加略縮圖。 效果如下&#xff1a; 附部分代碼&#xff1a; …

嬰幼兒托育服務與管理實訓室:托育未來的基石

在社會對嬰幼兒托育服務的重視程度不斷加深的當下&#xff0c;專業托育人才的需求急劇增長。嬰幼兒托育服務與管理專業作為培育這類人才的關鍵途徑&#xff0c;要求學生熟練掌握嬰幼兒身心發展、飲食營養以及衛生保健等基礎知識&#xff0c;同時具備全面的照護與管理能力。要實…

(自用)若依生成左樹右表

第一步&#xff1a; 在數據庫創建樹表和單表&#xff1a; SQL命令&#xff1a; 商品表 CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255) , price DECIMAL(10, 2) , stock INT NOT NULL, category_id INT NOT NULL); 商品分類…

Linux:DNS服務配置(課堂實驗總結)

遇到的問題&#xff0c;都有解決方案&#xff0c;希望我的博客能為你提供一點幫助。 操作系統&#xff1a;rocky Linux 9.5 ??一、配置DNS服務器的核心步驟?? 步驟 1&#xff1a;安裝 BIND 軟件?? ??檢查是否安裝??&#xff1a; rpm -qa | grep "^bind"…

搭建一個Spring Boot聚合項目

1. 創建父項目 打開IntelliJ IDEA&#xff0c;選擇 New Project。 在創建向導中選擇 Maven&#xff0c;確保選中 Create from archetype&#xff0c;選擇 org.apache.maven.archetypes:maven-archetype-quickstart。 填寫項目信息&#xff1a; GroupId&#xff1a;com.exampl…

若依前后端分離版運行教程、打包教程、部署教程

后端打包教程 注意&#xff1a;需要先運行redis 2、前端運行教程 2.1安裝依賴 2.2運行 打開瀏覽器查看,地址&#xff1a;http://localhost:80 3、前端打包教程 3.1打包 3.2運行打包好的文件&#xff0c;先找到打包好的文件 這是nginx的文件結構 將打包好的文件放到html目錄下…

SpringAi 會話記憶功能

在使用chatGPT&#xff0c;豆包等產品后&#xff0c;就會發現他們的會話有“記憶”功能。 那么我們用API接口的話&#xff0c;這個是怎么實現的呢&#xff1f; 屬于比較粗暴的方式&#xff0c;把之前的內容與新的提示詞一起再次發給大模型。讓我們看到他們有記憶功能。 下面介紹…

基于Python的經濟循環模型構建與可視化案例

一、代碼結構概覽 該代碼構建了一個包含經濟數據生成、可視化分析和政策模擬的交互式經濟系統仿真平臺&#xff0c;主要包括三大模塊&#xff1a; 多部門經濟數據生成&#xff1a;模擬包含產業關聯的復雜經濟數據 增強型可視化&#xff1a;提供多維度的經濟數據分析視圖 Das…

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 部分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多&#xff0c;但是G題想簡單了出大問題&#xff0c;預估50101015120860&#xff0c;道阻且長&#xff0c;再接再厲 A: 攻擊次數 答案&#xff1a;103&#xff1f;181&#xff1f;題目沒說明白每回合是…

C++基礎精講-05

文章目錄 1.構造函數初始化列表1.1 初始化列表的使用1.2 有參構造函數的默認值 2.對象所占空間大小2.1 大小的計算2.2 內存對齊機制 3. 析構函數3.1 基本概念3.2 總結 4.valgrind工具集4.1 介紹4.2 memcheck的使用 5. 拷貝構造函數5.1 拷貝構造函數定義5.2 淺拷貝/深拷貝5.3 拷…

文章記單詞 | 第28篇(六級)

一&#xff0c;單詞釋義 shirt /???t/ n. 襯衫&#xff1b;襯衣commonly /?k?m?nli/ adv. 通常地&#xff1b;一般地&#xff1b;普遍地pick /p?k/ v. 挑選&#xff1b;采摘&#xff1b;撿起&#xff1b;選擇&#xff1b;n. 選擇&#xff1b;鶴嘴鋤&#xff1b;精華com…

安裝低版本Pytorch GPU

網上很多教程都是自動安裝&#xff0c;不指定版本&#xff0c;其實有大問題。而且torch、torchvision、torchaudio的版本必須是對應&#xff0c;所以一旦版本不對&#xff0c;就可能會出現各種問題。 其實Pytorch官網就已經給出了安裝低版本的教程 登入Pytorch官網 點擊previo…

2025認證杯挑戰賽B題【 謠言在社交網絡上的傳播 】原創論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了認證杯數學中國數學建模網絡挑戰賽第一階段B題目謠言在社交網絡上的傳播完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半…