学习笔记九——Rust所有权机制
🦀 Rust 所有权机制
📚 目录
- 什么是值类型和引用类型?值语义和引用语义?
- 什么是所有权?为什么 Rust 需要它?
- 所有权的三大原则(修正版)
- 移动语义 vs 复制语义:变量赋值到底发生了什么?
- 绑定和作用域:值的“活多久”与“谁管它”
- 引用和借用:本质是什么?为什么这么设计?
- 借用的三条规则(逐条解释+示例)
- 生命周期:引用能用多久?
- 生命周期参数:为什么需要?怎么用?
- Rust 的借用检查器是怎么帮你“兜底”的?
- 总结与学习建议
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 所有权的三大原则
- 每个值在任意时刻只能有一个所有者。
- 当所有者离开作用域,值会被自动释放。
- 一个值只能有一个可变引用,或任意多个不可变引用,但不能同时存在。
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>
是生命周期参数x
、y
、返回值 都必须活得跟'a
一样久
📌 一般来说,编译器可以自动推断。但在函数返回引用时,必须显式写出生命周期参数。
🔟 Rust 的借用检查器是怎么帮你的?
Rust 有一个非常强大的“借用检查器”(Borrow Checker),会在编译阶段检查:
- 有没有悬空引用?
- 可变引用有没有被别名?
- 是否混用了可变和不可变引用?
- 生命周期是否符合规则?
🧠 你写错了引用规则,Rust 不会让你运行,而是直接编译失败。
✅ 借用检查器就是 Rust 安全的“守门员”!它会严格替你把关内存安全。
🔚 总结与学习建议
概念 | 通俗解释 |
---|---|
所有权 | 谁拥有值,谁负责清理 |
移动 | 所有权转移,原值失效 |
复制 | 创建副本,两个变量互不影响 |
借用 | 临时访问但不拥有,分可变/不可变 |
引用 | 表示地址,借用的语法工具 |
生命周期 | 引用能活多久(不能活得比原值久) |
生命周期参数 | 显式告诉编译器“谁和谁一样久” |
!
相关文章:
学习笔记九——Rust所有权机制
🦀 Rust 所有权机制 📚 目录 什么是值类型和引用类型?值语义和引用语义?什么是所有权?为什么 Rust 需要它?所有权的三大原则(修正版)移动语义 vs 复制语义:变量赋值到底…...
计算机视觉算法实现——电梯禁止电瓶车进入检测:原理、实现与行业应用(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 电梯安全检测领域概述 近年来,随着电动自行车(以下简称"电瓶车"&…...
扩散模型 Diffusion Model 整体流程详解
🧠 Diffusion Model 思路、疑问和代码 文章目录 🧠 Diffusion Model 思路、疑问和代码🔄 一、核心思想:从噪声到图像📦 二、正向过程:加噪🧠 三、反向过程:学习去噪🎯 目…...
[Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL
本文内容组织形式 总结具体例子执行语句解析层优化层物理计划层执行层 猜你喜欢PS 总结 先写个总结,接下来会分别产出各个部分的源码解析,Spark SQL主要分为以下五个执行部分。 具体例子 接下来举个具体的例子来说明 执行语句 SELECT name, age FR…...
【数据结构_7】栈和队列(上)
一、概念 栈和队列,也是基于顺序表和链表实现的 栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。 遵循后进先出的原则 此处所见到的栈,本质上就是一个顺序表/链表,但是,实在顺序表/链表的基础…...
Linux中的cat命令常见用法
在 Linux 中,cat 命令是 concatenate(连接)的缩写,意思是“连接”或“串联”。 基本功能 cat 命令的主要功能是用于查看、合并和创建文件。它会将一个或多个文件的内容输出到标准输出设备(通常是终端屏幕)…...
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
效果图 如下图所示,让一个 div 变成三角形,并且可随意更改大小, 本文提供了可运行示例源码,直接复制即可。 实现源码 建议创建一个 demo.html 文件,一键复制代码运行。 <style> .div{width: 0px;height: 0px…...
springboot 项目 jmeter简单测试流程
测试内容为 主机地址随机数 package com.hainiu.example;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotat…...
设计模式实践:模板方法、观察者与策略模式详解
目录 1 模板方法1.1 模板方法基本概念1.2 实验1.2.1 未使用模板方法实现代码1.2.2 使用模板方法的代码 2 观察者模式2.1 观察者模式基本概念2.2 实验 3 策略模式3.1 策略模式基本概念3.2 实验 1 模板方法 1.1 模板方法基本概念 定义:一个操作中的算法的骨架 &…...
Google的AI模型Gemini和Gemini网络协议
粉丝私信问我:gemini如何访问? "Gemini如何访问"需明确区分两种完全不同的技术体系:Google的AI模型Gemini和Gemini网络协议。以下是两者的访问方式详解: 一、访问Google的Gemini AI模型 1. 通过Web应用 地址…...
HTTP实现心跳模块
HTTP实现心跳模块 使用轻量级的cHTTP库cpp-httplib重现实现HTTP心跳模块 头文件HttplibHeartbeat.h #ifndef HTTPLIB_HEARTBEAT_H #define HTTPLIB_HEARTBEAT_H#include <string> #include <thread> #include <atomic> #include <chrono> #include …...
基于web的民宿信息系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息时代的来临,民宿过去的民宿信息方式的缺点逐渐暴露,对过去的民宿信息的缺点进行分析,采取计算机方式构建民宿信息系统。本文通过阅读相关文献,研究国内外相关技术,提出了一种民宿信息管理、民宿信息管理…...
使用OpenSceneGraph (osg)实现一个星系漫游
简介 使用OpenSceneGraph (osg)实现了一个太阳系漫游的程序,具有以下特点: 1.通过按键控制飞行器前进后退、空间姿态; 2.星系渲染; 3.背景星空渲染; 效果 提供了一张超大的星空背景图 代码示例 int main(int a…...
笔试专题(九)
文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…...
sklearn决策树 待更新
注意:sklearn中所有的决策树模型包括回归决策树实现的是CART决策树算法,在官方文档中有介绍。sklearn中的决策树模型最终得到的树结构都是二叉树,因为CART算法生成的就是二叉树。 DecisionTreeClassifier类 如果待预测样本有多个类别具有相同…...
eino v0.3.21 重磅发布!节点中断控制+空值映射支持,AI应用开发再添神器!
CloudWeGo/eino v0.3.21 作为最新补丁版本,聚焦流程控制与数据映射两大核心场景,为AI应用与微服务开发者提供更灵活的调试能力与容错设计! 1. 节点中断控制(Feat: Node Interrupt) • 功能亮点:新增 node …...
力扣每日打卡 50. Pow(x, n) (中等)
[TOC](力扣 50. Pow(x, n) 中等) 前言 这是刷算法题的第十一天,用到的语言是JS 题目:力扣 50. Pow(x, n) (中等) 一、题目内容 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1࿱…...
Mac M1管理多个Node.js版本
目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…...
arm_math.h、arm_const_structs.h 和 arm_common_tables.h
在 FOC(Field-Oriented Control,磁场定向控制) 中,arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件,用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…...
每天五分钟深度学习:非线性激活函数的导数
本文重点 本文探讨了神经网络中几种常见非线性激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Softmax)的导数特性。通过对各激活函数导数的数学推导与实际应用分析,揭示了不同激活函数在梯度传播、收敛速度及模型表达能力方面的差异。研究发现,ReLU及其变体在计算效率与…...
OpenHarmony5.0.2 USB摄像头适配
开发环境 OpenHarmony5.0.2 RK3568 USB摄像头 遇到问题 编译后插上USB摄像头后打开相机无图像 解决思路 5.0.2版本是支持USB摄像头的,需要修改默认的板载相机配置即可。 修改代码 1、修改配配置 文件地址:vendor/hihope/rk3568/hdf_config/uhdf…...
vue: router基础用法
router基础用法 1.安装router2.配置router3.路由编程1.编程式导航2.声明式导航 1.安装router 在node环境下,直接运行 npm install router42.配置router 创建文件夹并命名为router 在router文件夹中创建index.js index.js示例配置如下: import { creat…...
IDE中使用Spring Data Redis
步骤一:导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二:配置Redis数据源 步骤三&…...
【计网】网络交换技术之报文交换(复习自用,了解,重要3)
复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记: 电路交换 分组交换 一、报文交换的定义 报文交换(Me…...
GitLab 17.x 配置 https
文章目录 使用外部 nginx 参考:https://docs.gitlab.com/omnibus/settings/nginx.html 使用内置 nginx 参考:https://docs.gitlab.com/omnibus/settings/ssl/index.html#configure-https-manually // 使用自己手工申请证书 $ mkdir /etc/gitlab/ssl $ m…...
中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)
1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等…...
【编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用】
编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用; vue3-sfc-loader主要特征: 编写Node接口:Vue2项目使用:Vue3项目使用:(页面按需加载插件、图片等)主要使用&am…...
vue入门:template 和 JSX
temlplate 和 jsx 最终渲染时都是创建 dom 节点 template 和 JSX 混合使用 <template><div><span>Message: {{ msg }}</span><br/><VNodes :vnodes"getJSXSpan()"/><VNodes :vnodes"getAnchoredHeading(4)"/>…...
[Dify] Dify 本地部署及连接 Ollama 模型全流程指南
在构建私有化智能应用时,Dify 作为一款开源的大模型应用开发平台,具备强大的插件体系和可扩展能力。本文将详细介绍如何在本地环境中部署 Dify,并成功连接本地的 Ollama 模型,解决实际部署过程中常见的问题与错误。 一、本地部署 Dify 步骤详解 1. 安装 Docker 环境(以 W…...
基于PyQt5的Jupyter Notebook转Python工具
一、项目背景与核心价值 在数据科学领域,Jupyter Notebook因其交互特性广受欢迎,但在生产环境中通常需要将其转换为标准Python文件。本文介绍一款基于PyQt5开发的桌面级转换工具,具有以下核心价值: 可视化操作:提供友好的GUI界面,告别命令行操作 批量处理:支持目录递归…...
从自然语言到 JSON 数据交互:探索 MCP 协议的自动化任务实现
好的!以下是基于我们讨论的关于 MCP 协议、JSON 数据交互以及自然语言到 JSON 转换的实现过程的总结,格式化为一篇 CSDN 风格的博客记录。这篇文章将记录你的发现,适合分享给技术社区。 从自然语言到 JSON 数据交互:探索 MCP 协议…...
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使) 简介 n8n 介绍 一、高度可定制性 二、丰富的连接器生态 三、自托管部署(本地部署) 四、社区驱动 n8n 的部署 一、前期准备 二、部署步…...
嵌入式学习(37)-STM32串口发送中断的实现
一、概述 项目中需要用到发送中断,所以了解了发送中断的一些知识。 二、应用 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE1,表明发送数据寄存器为空, TC1表明发送已完成。 USART_ITConfig(USART1, USA…...
Android envsetup与Python venv使用指南
Android envsetup 和 Python venv 是两种完全不同的环境配置工具,分别服务于不同的开发场景。以下是对它们的详细解释及使用方法: 1. Android envsetup 用途: Android envsetup 是 Android 源码开发中的环境配置脚本(envsetup.sh…...
安卓关机和重启源码流程
// systemui关机 frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java Overridepublic void shutdown() {try {mBarService.shutdown();} catch (RemoteException e) {}}frameworks/base/services/core/java/com/android…...
解决单设备号双目摄像头调用难题:经验分享与总结
解决单设备号双目摄像头调用难题:经验分享与总结 在计算机视觉项目中,双目摄像头的调用是常见需求,但过程中往往会遇到各种挑战。最近,我就经历了一段曲折但最终成功解决问题的历程,现在将这段宝贵经验分享给大家。 一、问题背景 我手头的双目摄像头仅有一个设备号(设…...
【RL系列】DAPO: An Open-Source LLM Reinforcement Learning System at Scale
1. 简介 尽管RL对complex reasoning效果提升有重要作用,但是在openAI o1和DeepSeek R1 technical report上都没有详细的实验细节。本文主要提出了DAPO算法,提出了4个关键技术点并开源参数和代码。在AIME 2024验证了DAPO算法的有效性。 2. Tricks Exc…...
五子棋(测试报告)
文章目录 一、项目介绍二、测试用例三、自动化测试用例的部分展示注册登录游戏大厅游戏匹配 总结 一、项目介绍 本项目是一款基于Spring、SpringMVC、MyBatis、WebSocket的双人实时对战五子棋游戏,游戏操作便捷,功能清晰明了。 二、测试用例 三、自动化测试用例的…...
【小工具】定时任务执行器
定时任务执行器 背景版本代码JobJob执行机 背景 有时我们的项目内需要一个定时执行器来执行某些任务,就需要一个简单好用的定时任务机。 注意,这个定时任务机并不原生支持分布式,如果需要分布式的功能请自己实现。 版本 jdk21 代码 Job …...
LVGL源码(7):渲染
在LVGL源码(4):LVGL关于EVENT事件的响应逻辑_lvgl实现显示打车-CSDN博客这篇文章中,我们提到了LVGL的三大步骤:检测用户输入操作、调用我们编写的逻辑、在屏幕上显示对应的画面;而在学习完“样式”之后,我们或许可以将上述步骤说明…...
02_通过调用硅基流动平台deepseekapi按输入的标题生成文章
from openai import OpenAIclient OpenAI(base_urlhttps://api.siliconflow.cn/v1,api_keyyou api-key )# 定义关键词变量 keyword "人性的弱点都有哪些?"# 发送带有流式输出的请求 response client.chat.completions.create(model"deepseek-ai/D…...
三、Virtual Device Manager
一、创建AVD AVD是Android Virtual Device(安卓虚拟设备),我们可以启动Android Studio 选择 Virtual Device Manager 创建并启动一个模拟器。 二、设置屏幕大小 上面直接创建的镜像是不能设置屏幕大小的,启动后笔记本屏幕都放不下ÿ…...
MATLAB2022b安装
1 从百度网盘下载MATLAB2022b,下载完成后解压到某个文件夹; 链接: MATLAB2022b 提取码: 6666 2 打开解压后的文件夹,进入setup文件夹,双击打开“setup.exe”文件; 3 在弹出窗口中选择“高级选项”-->“我有文件安…...
计算机编码
计算机,不能直接存储文字,存储的是编码。 计算机只能处理二进制的数据,其它数据,比如:0-9、a-z、A-Z,这些字符,我们可以定义一套规则来表示。假如:A用110表示,B用111表示…...
Dell EMC Unity NAS 认证方式介绍
近日有个客户要配置EMC Unity的NAS访问,我们知道NAS有Linux环境下的NFS和Windows环境下的SMB(也叫做CIFS)。单独配置其中的一种访问协议相对简单,但是客户提出的要求是要对文件系统同时NFS和SMB访问,这就有些复杂&…...
SpringAi 会话记忆功能
在使用chatGPT,豆包等产品后,就会发现他们的会话有“记忆”功能。 那么我们用API接口的话,这个是怎么实现的呢? 属于比较粗暴的方式,把之前的内容与新的提示词一起再次发给大模型。让我们看到他们有记忆功能。 下面介绍…...
BUUCTF-web刷题篇(25)
34.the mystery of ip 给出链接,输入得到首页: 有三个按钮,flag点击后发现页面窃取客户端的IP地址,通过给出的github代码中的php文件发现可以通过XFF或Client-IP传入值。使用hackbar或BP 使用XSS,通过github给出的目录…...
Elasticsearch 性能优化:从原理到实践的全面指南
Elasticsearch(ES)作为一款基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、搜索引擎和实时数据处理等场景。然而,在高并发、大数据量环境下,Elasticsearch 的性能可能面临瓶颈,如查询延迟高、索引…...
UITableVIew性能优化概述
UITableVIew性能优化概述 文章目录 UITableVIew性能优化概述前言如何优化优化的本质卡顿的原因 CPU层级cell复用UITableVIew尽量采用复用 定义cell的种类尽量少,可以多用hidden缓存cell高度基础设置预先设置高度设置一个预先缓存 异步绘制滑动按照需加载尽量显示大小…...
【Linux网络与网络编程】09.传输层协议TCP
前言 TCP 即 传输控制协议 (Transmission Control Protocol),该协议要对数据的传输进行一个详细的控制(数据传输时什么时候传输,一次发多少,怎么发,出错了怎么办……) 本篇博客将从下面这张TCP协议格式图…...