学习笔记九——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.mzph.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;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半…