Rust 圣经 阅读 引用与借用

Rust 通过 借用(Borrowing) 在使用某个变量的指针或引用。
获取变量的引用,称之为 借用(borrowing)

引用与解引用

引用是为了解决在使用函数时,频繁地传递所有权。
引用只是获取了引用权,而不是获取所有权。

fn main() {
let s = String::from("Hello");let s1 = &s; // 不可变引用let s2 = &mut 2; // 可变引用/*
这个程序不能编译通过。
因为不能同时存在 可变引用 和 不可变引用。
*/
}

引用与变量一样,也是默认为不可变。
不仅是原来的变量是可变就可以,必须是引用也是可变的,即在使用let s1 = &mut s 或传递参数 &mut s

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

解引用

fn main() {
let s = String::from("hello");let s1 = &s; // s 的 不可变引用println!("{}",*s1);
}

可以在一个引用作用域中存在多个不可变引用,但只能存在一个可变引用。
引用的作用域是从引用开始,到该引用的最后一次使用。

fn main() {let mut s = String::from("hello");let r1 = &s;let r2 = &s;println!("{} and {}", r1, r2);// 新编译器中,r1,r2作用域在这里结束let r3 = &mut s;println!("{}", r3);
} // 老编译器中,r1、r2、r3作用域在这里结束// 新编译器中,r3作用域在这里结束

可变引用只能存在一个。直到该引用结束,才可以使用另一个。
在一个可变引用的引用作用域结束之间,无法创建第二个可变引用。

不能从一个不可变引用上借用可变。可以从可变对象上借用可变。

Rust 不允许出现 悬垂引用,即空的引用。悬垂引用会再编译时被检测出来 。

fn main() {let reference_to_nothing = dangle();
}fn dangle() -> &String {let s = String::from("hello");&s
}/*
编译不能通过,因为返回的引用指针是空的,
这种情况更推荐转移所有权。
**/

借用规则

  • 同一时刻(在当前作用域中),只能拥有一个可变引用,或多个不可变引用。
  • 引用必须总是有效的。

ref

ref& 类似,可以用来获取一个值的引用。


fn main() {let c = '中';let r1 = &c;let ref r2 = c;assert_eq!(*r1, *r2);// 判断两个内存地址的字符串是否相等assert_eq!(get_addr(r1),get_addr(r2));
}// 获取传入引用的内存地址的字符串形式
fn get_addr(r: &char) -> String {format!("{:p}", r)
}

ref 同样获取c的引用,而且指向了同一个内存地址。
请添加图片描述

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

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

相关文章

魔改Stable Diffusion,开源创新“单目深度估计”模型

单目深度估计一直是计算机视觉领域的难点。仅凭一张 RGB 图像,想要还原出场景的三维结构,在几何结构上非常不确定,必须依赖复杂的场景理解能力。 即便使用更强大的深度学习模型来实现,也面临算力需求高、图像数据注释量大、泛化能力弱等缺点。 为了解决这些难题&a…

线性代数第一课+第二课总结

第一课 第一课是简单的行列式计算,主要就是要把左下角的数字全部转换为0,通过减去其他行的式子即可实现,最后把对角线的所有数字相乘,得到的结果是最后行列式的答案 第二课 例题1 硬算理论上其实也是可行的,但是使…

R语言——reshape2包、tidyr包、dplyr包(五)

目录 一、数据转换之reshape2包:melt与dcast函数 二、数据转换之tidyr包:gather与spread函数,separate与unite函数 三、据转换之dplyr包 四、参考 一、数据转换之reshape2包:melt与dcast函数 merge 函数 使用merge函数 x &l…

听GPT 讲Rust源代码--library/proc_macro

File: rust/library/proc_macro/src/bridge/rpc.rs 在Rust源代码中,rust/library/proc_macro/src/bridge/rpc.rs文件的作用是实现了Rust编程语言的编译过程中的远程过程调用(RPC)机制。 这个文件定义了与编译器的交互过程中使用的各种数据结构…

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站?12个网站,阿里云服务器网的2核2G服务器上安装了12个网站,甚至还可以更多,具体放几个网站取决于网站的访客数量,像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

LeetCode 1758. 生成交替二进制字符串的最少操作数【字符串,模拟】1353

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

【数值分析】三次样条插值

三次样条插值 2023年11月5日 #analysis 文章目录 三次样条插值1. 样条函数1.1 截断多项式 2. 三次样条插值2.1 B样条为基底的三次样条插值函数2.1.1 第一种边界条件2.1.2 第二种边界条件2.1.3 第三种边界条件 2.2 三弯矩法求三次样条插值函数2.2.1 第一种边界条件2.2.2 第二种…

万界星空科技低代码平台基本模块与优势

低代码平台(Low-Code Development Platform,LCDP)就是使用低代码的方式进行开发,能快速设置和部署的平台。低代码平台旨在简化应用开发过程,降低开发难度,缩短开发周期,并使非专业程序员&#x…

线性代数笔记3 1.1

学习视频: 2.2 矩阵运算(二)_哔哩哔哩_bilibili 包括内容: p10矩阵运算(二) p11特殊矩阵 p12逆矩阵(一) p13逆矩阵(二)

JSON与XML的比较:优缺点分析与应用场景选择

JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)都是用于存储和传输数据的格式,它们各自具有一些优点和缺点,适用于不同的应用场景。 JSON的优点: 易读性:JSO…

基于Python +Selenium的爬虫详解

今天我们来详细学习一些 selenium 的强大用法 一、selenium简介 由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断; 1、什么是sele…

几个实用网站

论文短语:https://www.phrasebank.manchester.ac.uk/ 翻译:https://www.deepl.com/en/translator 润色:https://quillbot.com/ 榜单:www.paperwithcode.com ****NLP民工的乐园: 几乎最全的中文NLP资源库:****https…

Python将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起

将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起。 这个需求在实际开发过程中应该说非常常见,当然python也给我们内置了相关方法! zip(*iterables, strictFalse) 在多个迭代器上并行迭代,从每…

PowerShell——多任务后台作业

PowerShell——多任务后台作业 实验环境:操作系统为Windows8(或之后)或者Windows Server2012(或之后)运行PowerShell v3或更新版本的计算机 任务: 创建一个后台作业获取计算机上系统事件日志中最近的26条错误记录,之后将记录导出…

算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解

引言,少年们,大家好。在这里祝大家元旦快乐,我是博主那一脸阳光,今天来介绍二分查找 在计算机科学领域,搜索算法是数据处理和问题解决的重要工具之一。其中,**二分查找算法(Binary Search&#…

最小费用最大流

package tgb.第三章; import java.util.ArrayDeque; import java.util.Arrays; import java.util.Queue; import java.util.Scanner; public class ok货物调配{ static int maxData 0x7fffffff; static Queue dl new ArrayDeque(); static int head[] new int[5001]; stat…

Git开发工具基本使用

文章目录 前言Git仓库基本概念基本环境安装清除原先配置生成秘钥配置Host添加公钥Github添加Gitee添加测试 本地仓库基本概览查看提交日志(log)版本回退添加文件至忽略列表分支分支冲突 远程仓库推送到远程仓库从远程仓库中抓取和拉取 在Idea中使用Git总结 前言 这里只是对Git…

react--自定义列表字段

支持react表格自由选择展示的字段,支持全选 1、组件代码如下 import type { ModalProps } from "antd"; import type { CheckboxChangeEvent } from "antd/lib/checkbox"; import type { CheckboxValueType } from "antd/lib/checkbox/…

Perforce:2024年改变数字化格局的五大技术趋势

自去年ChatGPT发布以来,生成式人工智能占据了头条、会议,甚至占据了我自己工作场合的对话。人工智能技术如此迅速地改变工作流程和公司的关注点,真是令人难以置信。 我叫瑞安,在技术领域工作了近二十年,拥有15年的全栈…

图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 unet医学细胞分割实战1 unet医学细胞分割实战2 unet医学细胞分割实战3 unet医学细胞分割实战4 unet…