深入理解Rust引用与借用

文章目录

  • 一、概述
  • 二、引用与解引用
  • 三、不可变引用
  • 四、可变引用
    • 4.1、可变引用同时只能存在一个
    • 4.2、可变引用与不可变引用不能同时存在
    • 4.3、悬垂引用(Dangling References)


  团队博客: 汽车电子社区


一、概述

  获取变量的引用,称之为借用(borrowing)。

二、引用与解引用

  常规引用是一个指针类型,指向了对象存储的内存地址。在下面代码中,我们创建一个 i32 值的引用 y,然后使用解引用运算符来解出 y 所使用的值:

fn main() {let x = 5;let y = &x;assert_eq!(5, x);assert_eq!(5, *y);
}

  变量 x 存放了一个 i32 值 5。y 是 x 的一个引用。可以断言 x 等于 5。然而,如果希望对 y 的值做出断言,必须使用 *y 来解出引用所指向的值(也就是解引用)。一旦解引用了 y,就可以访问 y 所指向的整型值并可以与 5 做比较。

三、不可变引用

fn main() {let s1 = String::from("hello");let len = calculate_length(&s1);println!("The length of '{}' is {}.", s1, len);
}fn calculate_length(s: &String) -> usize {s.len()
}

  & 符号即是引用,它们允许你使用值,但是不获取所有权,如图所示:
在这里插入图片描述
  通过 &s1 语法,我们创建了一个指向 s1 的引用,但是并不拥有它。因为并不拥有这个值,当引用离开作用域后,其指向的值也不会被丢弃。
  同理,函数 calculate_length 使用 & 来表明参数 s 的类型是一个引用:

fn calculate_length(s: &String) -> usize { // s 是对 String 的引用s.len()
} // 这里,s 离开了作用域。但因为它并不拥有引用值的所有权,// 所以什么也不会发生

  正如变量默认不可变一样,引用指向的值默认也是不可变的,没事,来一起看看如何解决这个问题。

四、可变引用

fn main() {let mut s = String::from("hello");change(&mut s);
}fn change(some_string: &mut String) {some_string.push_str(", world");
}

  首先,声明 s 是可变类型,其次创建一个可变的引用 &mut s 和接受可变引用参数 some_string: &mut String 的函数。

4.1、可变引用同时只能存在一个

不过可变引用并不是随心所欲、想用就用的,它有一个很大的限制: 同一作用域,特定数据只能有一个可变引用:
  这种限制的好处就是使 Rust 在编译期就避免数据竞争,数据竞争可由以下行为造成:
    1、两个或更多的指针同时访问同一数据。
    2、至少有一个指针被用来写入数据。
    3、没有同步数据访问的机制。
  数据竞争会导致未定义行为,这种行为很可能超出我们的预期,难以在运行时追踪,并且难以诊断和修复。而 Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码!
  很多时候,大括号可以帮我们解决一些编译不通过的问题,通过手动限制变量的作用域:

let mut s = String::from("hello");{let r1 = &mut s;} // r1 在这里离开了作用域,所以我们完全可以创建一个新的引用let r2 = &mut s;

4.2、可变引用与不可变引用不能同时存在

  注意,引用的作用域 s 从创建开始,一直持续到它最后一次使用的地方,这个跟变量的作用域有所不同,变量的作用域从创建持续到某一个花括号 }

4.3、悬垂引用(Dangling References)

  悬垂引用也叫做悬垂指针,意思为指针指向某个值后,这个值被释放掉了,而指针仍然存在,其指向的内存可能不存在任何值或已被其它变量重新使用。在 Rust 中编译器可以确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器可以确保数据不会在其引用之前被释放,要想释放数据,必须先停止其引用的使用。
   1、同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用。
   -2、引用必须总是有效的。

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

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

相关文章

day3:基于UDP模型的简单文件下载

思维导图 tftp文件下载客户端实现 #include <head.h> #define SER_PORT 69 #define SER_IP "192.168.125.223" int link_file() {int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}return sfd; } int filedownloa…

智慧校园大数据应用系统介(3)

智能巡课系统 巡课系统是一种新的课堂观察记录工具,它将学校或区域内全体教师作为一个整体,采用数字化手段描述教师和学生的课堂行为。通过移动端实时记录和通用性的统计分析,使教育者更容易发现教学过程与教学成果之间的联系,有助于改变课堂生态、提高教学有效性、提升教…

《剑指 Offer》专项突破版 - 面试题 18、19 和 20 - 详解回文字符串(C++ 实现)

目录 前言 面试题 18 : 有效的回文 面试题 19 : 最多删除一个字符得到回文 面试题 20 : 回文子字符串的个数 前言 回文是一类特殊的字符串。不管是从头到尾读取一个回文&#xff0c;还是颠倒过来从尾到头读取一个回文&#xff0c;得到的内容是一样的。 英语中有很多回文单…

【WPF.NET开发】以编程方式打印XPS文件

本文内容 可以使用 AddJob 方法的一个重载来打印 XML 纸张规范 (XPS) 文件&#xff0c;而根本无需打开 PrintDialog 或任何用户界面 (UI)&#xff08;从原理上讲&#xff09;。 还还可以使用多种 XpsDocumentWriter.Write 和 XpsDocumentWriter.WriteAsync 方法打印 XPS 文件…

04--JdbcTemplate模版

1、JdbcTemplate模版 1.1 概述 Spring JDBC Spring框架对JDBC的简单封装。提供了一个JdbcTemplate对象简化JDBC的开发&#xff08;后面专门讲spring框架) 1.2 实现步骤 1. 导入jar包 4 1 2. 创建JdbcTemplate对象。依赖于数据源DataSource JdbcTemplate template new JdbcTe…

【论文阅读 SIGMOD18】Query-based Workload Forecasting for Self-Driving

Query-based Workload Forecasting for Self-Driving Database Management Systems My Summary ABSTRACT Autonomous DBMS的第一步就是能够建模并预测工作负载&#xff0c;以前的预测技术对查询的资源利用率进行建模。然而&#xff0c;当数据库的物理设计和硬件资源发生变化…

Windows如何部署TortoiseSVN客户端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

Spring第六天(注解开发第三方Bean)

注解开发管理第三方Bean 显然&#xff0c;我们无法在第三方Bean中写入诸如service这样的注解&#xff0c;所以&#xff0c;Spring为我们提供了Bean这一注解来让我们通过注解管理第三方Bean 第二种导入方式由于可读性太低&#xff0c;故只介绍第一种导入方式&#xff0c;这里我…

自动化工具实践操作-注入自定义代码

功能 采集掘金左边每个tab下文章的标题。人为操作就是点击一个tab&#xff0c;复制文字标题&#xff0c;重复以上操作。根据这个&#xff0c;我们可以转换成自己的代码 开始设计 如上文操作基本一致。新建任务、设计点击事件如出一辙。 自定义循环事件 操作循环节点&#…

R语言【cli】——ansi_has_any():检查字符串里是否存在ANSI格式

Package cli version 3.6.0 Usage ansi_has_any(string, sgr TRUE, csi TRUE, link TRUE) Arguments 参数【string】&#xff1a;要检查的字符串。它也可以是字符向量 参数【sgr】&#xff1a;是否查找SGR(样式化)控制序列。 参数【csi】&#xff1a;是否查找非sgr控制序…

ubuntu下常见查看库信息的指令

要查看共享库&#xff08;例如 liblog4cplus.so&#xff09;的信息&#xff0c;可以使用一些工具来获取有关库的详细信息。以下是一些常用的方法&#xff1a; 1. 使用 nm 命令&#xff1a; nm 命令用于显示目标文件或共享库的符号表。你可以运行以下命令查看 liblog4cplus.so…

Mysql:重点且常用的操作和理论知识整理 ^_^

目录 1 基础的命令操作 2 DDL 数据库定义语言 2.1 数据库操作 2.2 数据表操作 2.2.1 创建数据表 2.2.2 修改和删除数据表 2.2.3 添加外键 3 DML 数据库操作语言 3.1 插入语句(INSERT) 3.2 修改语句(UPDATE) 3.3 删除语句 3.3.1 DELETE命令 3.3.2 TRUNCATE命令 4 …

第1周:Day 3 - PyTorch与TensorFlow的异同介绍(入门级)

第1周&#xff1a;Day 3 - PyTorch介绍 学习目标 理解PyTorch的基本概念和主要特点。 成功安装PyTorch环境。 PyTorch简介 PyTorch 是一个开源的机器学习库&#xff0c;广泛用于计算机视觉和自然语言处理等领域。 它由Facebook的人工智能研究团队开发&#xff0c;提供了丰富的A…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键&#xff0c;开始将变更的代码进行提交的时候&#xff0c;【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本&#xff0c;不行的话 会显示一个 fix的字样&#xff0c;行…

【日常聊聊】边缘计算的挑战和机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一&#xff1a;数据安全与隐私保护 二&#xff1a;网络稳定性与可靠性 三&#xff1a;实时性与性能优…

Unity中的协程

定义&#xff1a;协程使得任务的执行可以分配到多个帧中完成&#xff0c;在Unity中&#xff0c;协程从开始执行到第一个yield return 语句后将调用权归还Unity主线程&#xff0c;并在紧随的下一帧继续从上次结束调用的代码上下文位置恢复执行。 常见应用场景&#xff1a;HTTP请…

【Vue】属性计算 computed

<script setup>import { ref,computed} from vue let hbs ref([]); //装爱好的值const publishHbsMessagecomputed(()>{return hbs.value.length>0?Yes:No}) </script><template><div>吃 <input type"checkbox" name"hbs&qu…

C++入门学习(八)sizeof关键字

sizeof 是 C 和 C 中的一个运算符&#xff0c;用于确定特定类型或对象的内存大小&#xff08;以字节为单位&#xff09;。 1、查看数据类型占据内存大小 #include <iostream> using namespace std; int main() {short a 1;int b 1;long c 1;long long d 1;cout<…

Ubuntu使用docker-compose安装chatGPT

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;十五&#xff09;——使用docker-compose安装chatGPT Welcome to the AI era! 使用docker compose安装 在/usr/local文件夹下创建chatgpt mkdir chatgpt创建docker-compose.yaml vim docker-compos…

代码随想录算法训练营Day32|122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II

目录 122.买卖股票的最佳时机 II 前言 思路 算法实现 55. 跳跃游戏 思路 算法实现 45.跳跃游戏 II 前言 思路 算法实现 总结 122.买卖股票的最佳时机 II 题目链接 文章链接 前言 本题要求只能持有一支股票&#xff0c;根据每日股票的价格控制股票的买入和卖出获取最…