【Rust】引用与借用

目录

思维导图

1. 引用与借用的基本概念

1.1. 引用示例

2. 借用的规则

2.1. 可变借用示例

2.2. 借用的限制

3. 引用的生命周期


思维导图

1. 引用与借用的基本概念

  • 引用的定义引用是一种指向数据的指针,但与裸指针不同,Rust的引用在编译时受到严格的规则约束,确保其始终指向有效的内存区域。引用分为不可变引用(&T)和可变引用(&mut T)。
  • 借用的意义借用是指在不获取数据所有权的情况下,通过引用访问或修改数据的过程。借用机制允许在多个上下文中共享数据,同时避免数据竞争和内存安全问题。

1.1. 引用示例

  • 示例1:计算字符串长度
    fn main() {let text = String::from("hello");let length = calculate_string_length(&text); // 传递不可变引用println!("The length of '{}' is {}.", text, length);
    }// 计算字符串长度的函数
    fn calculate_string_length(s: &String) -> usize {s.len() // 通过引用访问数据
    }
    • 在这个示例中,calculate_string_length函数接受一个字符串的引用&text,而不是直接获取String的所有权。这允许main函数在调用后继续使用text

2. 借用的规则

  • 不可变借用当一个值被不可变引用借用时,该值在借用期间不能被修改。允许多个不可变引用同时存在,确保数据的一致性。
  • 可变借用若要修改借用的值,必须使用可变引用&mut。Rust强制要求在同一时间只能有一个可变引用,或者多个不可变引用,但两者不能共存。这一规则防止了数据竞争的发生。

2.1. 可变借用示例

  • 示例2:修改借用的字符串
    fn main() {let mut s = String::from("hello");append_text(&mut s); // 传递可变引用println!("{}", s); // 输出修改后的字符串
    }// 修改字符串的函数
    fn append_text(s: &mut String) {s.push_str(", world"); // 通过可变引用修改数据
    }
    • 在这个示例中,s被声明为可变,并通过&mut s传递给append_text函数,允许对s进行修改。

2.2. 借用的限制

  • 多个可变引用的限制Rust禁止在同一作用域内同时存在多个可变引用,以防止数据竞争(data races)。数据竞争可能导致未定义行为,因此Rust在编译时严格检查此类问题。
  • 可变与不可变引用的限制:当同一个值有一个不可变引用时,便不能再拥有一个可变引用。
  • 示例3:多个可变引用的错误
    fn main() {let mut message = String::from("hello");let first_ref = &mut message; // 第一个可变引用// let second_ref = &mut message; // 取消注释会导致编译错误println!("First reference: {}", first_ref);// println!("Second reference: {}", second_ref); // 无法同时使用两个可变引用
    }
    • 此代码尝试同时创建两个可变引用,导致编译错误。

3. 悬空引用

  • Rust通过生命周期(lifetime)机制确保引用在使用期间始终指向有效的内存区域,避免了悬空引用的问题。生命周期是Rust编译器在编译时进行静态检查的重要工具。

  • 示例4:悬空引用的错误
    fn main() {// let dangling_ref = create_dangling_reference(); // 取消注释会导致编译错误// println!("{}", dangling_ref); // 无法使用悬空引用
    }// 尝试返回局部变量引用的函数
    fn create_dangling_reference() -> &String {let s = String::from("hello");&s // 编译错误:返回局部变量的引用
    }
    • 该示例试图返回一个局部变量的引用,导致编译错误,因为&s在函数结束后S会被释放。

tips: 

  • 在任何时候,你都可以拥有要么一个可变引用要么任意数量的不可变引用。
  • 引用必须始终有效。

补充:常见数据竞争:

  • 两个或多个指针同时访问相同的数据。
  • 至少有一个指针正在用于写入数据。
  • 没有使用任何机制来同步对数据的访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1377.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java内存与缓存

Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别,理解这两者对于优化Java应用至关重要。 Java 内存模型 Java内存模型(JMM)定义了线程如何以及何时可以看到其他线程修改过的共享变量的值,并且规…

java项目之智慧农贸信息化管理平台(ssm+mybatis+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的码农一枚。今天要和大家聊的是一款基于ssm的智慧农贸信息化管理平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 智慧农贸信息化管理平台…

java人脸识别

文章目录 前言 为什么选择虹软呢? 注册虹软账号,下载SDK 将jar包安装到maven本地仓库 项目实战 导入jar包 编写配置文件 Service 编写测试类 人脸识别更多应用 前言 ‌虹软人脸识别技术‌是由虹软公司开发的一系列人脸识别技术,包括…

【学习路线】Python自动化运维 详细知识点学习路径(附学习资源)

学习本路线内容之前,请先学习Python的基础知识 其他路线: Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析(数据科学) >> Python 算法(人工智能) >> Pyth…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目,前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

73.矩阵置零 python

矩阵置零 题目题目描述示例 1:示例 2:提示: 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…

【深度学习】通俗理解偏差(Bias)与方差(Variance)

在统计学习中,我们通常使用方差与偏差来衡量一个模型 1. 方差与偏差的概念 偏差(Bais): 预测值和真实值之间的误差 方差(Variance): 预测值之间的离散程度 低偏差低方差、高偏差低方差: 图中每个点表示同一个模型每次采样出不同…

Git学习记录

针对各个项目的gitignore文件示例 github/gitignore: A collection of useful .gitignore templates 忽略文件 文件 .gitignore 的格式规范如下: • 所有空行或者以 # 开头的行都会被 Git 忽略。 • 可以使用标准的 glob 模式匹配。 • 匹配模式…

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API,可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑,私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量,为了简化网络配置&#…

Cookie和Session

会话: 有状态会话: 客户端知道发起请求的是谁 无状态会话: 不知道发起请求的是谁 只知道有请求 http是无状态请求 保存会话信息的两种技术: 可以通过Cookie和Session储存会话信息 cookie:客户端技术 信心存…

ImportError: attempted relative import with no known parent package 报错的解决!

本人在做调用超级鹰API解决点触验证码时,两次出现本报错。研究后解决,步骤如下:(注意:如果项目目录结构简单且无中文目录,直接使用绝对路径即可解决!!!) 1.项…

介绍下不同语言的异常处理机制

Golang 在Go语言中,有两种用于处于异常的机制,分别是error和panic; panic panic 是 Go 中处理异常情况的机制,用于表示程序遇到了无法恢复的错误,需要终止执行。 使用场景 程序出现严重的不符合预期的问题&#x…

使用gtsam添加OrientedPlane3Factor平面约束因子

在基于地面约束的SLAM优化中,已知的地面信息(如 plan.pcd 文件中的地面模型)可以用作一个先验约束,以帮助优化位姿估计。具体而言,这个过程涉及将地面模型和每个帧的位姿结合,以创建一个因子模型&#xff0…

Cython全教程2 多种定义方式

—— 本篇文章,主要讲述Cython中的四种定义关键字 全教程2 多种定义方式: 在Cython中,关于定义的关键字有四个,分别是: cdef、def、cpdef、DEF 一、cdef定义关键字 顾名思义,cdef关键字定义的是一个C函数…

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换,后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件: ToolboxCreator.exe/ini:toolboxcreator…

primitive 的 Appearance编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体,Cesium.RectangleGeometry:几何体,Rectangle:矩形 let rectGeometry new…

《JavaWeb开发-javascript基础》

文章目录 《JavaWeb开发-javascript基础》1.javascript 引入方式2.JS-基础语法-书写语法2.1 书写语法2.2 输出语句 3.JS-基础语法-变量4.JS-基础语法-数据类型&运算符4.1 数据类型4.2 运算符4.3 数据类型转换 5. JS-函数6. JS-对象-Array数组7. JS-对象-String字符串8. JS-…

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言: 在我们之前的文章中,我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天,我们将继续这个系列,重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统(OpenAnolis&#…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

MySQL的安装

MySQL典型的关系型数据库(RDBMS):oracle、MySQL、SqlServer MySQL的版本 5.5~5.7、8.0 MySQL的安装和配置 下载地址: https://downloads.mysql.com/archives/community/ 安装包 (x86, 64-bit), MSI Installer 执行下一步即…