Rust 圣经 阅读 引用与借用

news2024/12/25 2:34:29

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.coloradmin.cn/o/1353400.html

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

相关文章

QML —— Canvas重绘钟表组件(附完整源码)

示例效果] 源码 main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine>int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const…

Nacos学习思维导图

一、服务注册 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 二、服务续约 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 三、服务…

案例089:基于微信小程序的校园综合服务平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

cmd命令启动C# windows服务程序

因为Process.Manage.Service.exe程序为Windows服务程序&#xff0c;不能直接双击打开&#xff0c;所以需要借助windows系统自带InstallUtil.exe程序来启动它。 以管理员身份运行cmd命令控制台窗口 输入命令进入到InstallUtil.exe程序所在的文件夹 cd C:\Windows\Microsoft.NET…

鸿蒙开发第一天

一、开发准备工作 1、开发工具的安装 1&#xff09;下载地址&#xff1a;https://developer.huawei.com/consumer/cn/deveco-studio/ 2&#xff09;查询API文档链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/syscap-00000014080893…

【操作系统xv6】学习记录2 -RISC-V Architecture

说明&#xff1a;看完这节&#xff0c;不会让你称为汇编程序员&#xff0c;知识操作系统的前置。 ref&#xff1a;https://binhack.readthedocs.io/zh/latest/assembly/mips.html https://www.bilibili.com/video/BV1w94y1a7i8/?p7 MIPS MIPS的意思是 “无内部互锁流水级的微…

手撕Vuex-vuex实现原理分析

本章节主要围绕着手撕 Vuex&#xff0c;那么在手撕之前&#xff0c;先来回顾一下 Vuex 的基本使用。 创建一个 Vuex 项目&#xff0c;我这里采用 vue-cli 创建一个项目&#xff0c;然后安装 Vuex。 vue create vuex-demo 选择 Manually select features。 这里只需要&#xff0…

莫比乌斯函数

积性函数定义 若gcd(p,q)1&#xff0c;有f(p*q)f(p)*f(q)&#xff0c;则f(x)是积性函数 其中规定f(1)1&#xff0c;对于积性函数有&#xff1a;所有的积性函数都可以用筛法求出 常见的积性函数有欧拉函数和莫比乌斯函数 筛法求莫比乌斯函数 const int N 1e9 5; const int …

哪些洗地机比较好?洗地机选购指南

随着社会生活水平的提高&#xff0c;人们对居家环境的卫生和清洁要求不断提升。家用洗地机作为一种先进的清洁工具&#xff0c;带来了许多便利和优势&#xff0c;特别是在解决一些特殊需求的家庭环境方面。 以下是一些家用洗地机的优势和适用场景&#xff1a; 1.高效清洁&…

[ Tool ] celery分布式任务框架基本使用

celery官方 Celery 官网&#xff1a;www.celeryproject.org/ Celery 官方文档英文版&#xff1a;docs.celeryproject.org/en/latest/i… Celery 官方文档中文版&#xff1a;docs.jinkan.org/docs/celery… Celery是一个简单、灵活且可靠的&#xff0c;处理大量消息的分布式系…

HackTheBox - Medium - Linux - Agile

Agile Agile 是一个中等难度的 Linux 机器&#xff0c;在端口 80 上有一个密码管理网站。创建帐户并添加几个密码后&#xff0c;发现网站的导出到 CSV 功能容易受到任意文件读取的攻击。其他终结点的枚举显示“/download”在访问时引发错误&#xff0c;并显示“Werkzeug”调试…

贪心算法part05 435无重叠区间

435无重叠区间 763 划分字母区间 56合并区间

什么是聚合支付,又能带来哪些好处?

随着科技的飞速发展&#xff0c;人们的支付方式也在不断地发生变革。从最初的现金支付、银行卡支付&#xff0c;到现在的移动支付、扫码支付等&#xff0c;支付方式已经变得越来越便捷。聚合支付作为一种新型的支付方式&#xff0c;也在逐渐改变着人们的生活方式。那么&#xf…

CSS 中间位置翻转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-hor-center: isAnimating }"><!-- 元素内容 -->…

一篇文章带你搞定Python所有内置函数

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…

深入解析d3dcompiler_47.dll文件及其丢失的修复方法

一、d3dcompiler_47.dll是什么文件&#xff1f; d3dcompiler_47.dll是DirectX SDK中的一个动态链接库文件&#xff0c;它是用于编译DirectX着色器的工具之一。DirectX是由微软公司开发的一种多媒体编程接口&#xff0c;它提供了一系列的API和工具&#xff0c;用于开发游戏和多…

打造专业开发者指南:针对ShardingProxy分库分表解决策略的深度剖析 – 详解部署、使用、服务治理与优化技巧

一、 ShardingProxy快速使用 ShardingProxy的功能同样是分库分表&#xff0c;但是他是一个独立部署的服务端&#xff0c;提供 统一的数据库代理服务。注意&#xff0c;ShardingProxy目前只支持MySQL和PostgreSQL。并且&#xff0c;客户端连接ShardingProxy时&#xff0c;最好使…

java每日一题——双色球系统(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;要求如下&#xff08;同时&#xff1a;红球每个号码不可以相同&#xff09; 编程思路&#xff1a;1&#xff0c;创建一个可以录入数字的数组&#xff1b;2&#xff0c;生成一个可以随机生成数字的数组&#xf…

MT8766安卓核心板规格参数_MTK8766核心板模块方案定制

MT8766安卓核心板&#xff1a;高性能、稳定可靠、集成度高的一体化解决方案 MT8766安卓核心板采用联发科MTK8766四核4G模块方案&#xff0c;是一款高度集成的安卓一体板。四核芯片架构&#xff0c;主频可达到2.0GHz&#xff0c;支持国内4G全网通。12nm制程工艺&#xff0c;支持…

虾皮跨境电商选品有哪些规则

如何在虾皮&#xff08;Shopee&#xff09;平台上进行跨境电商选品在如今全球化的商业环境中&#xff0c;跨境电商已成为许多卖家拓展业务的重要途径。虾皮&#xff08;Shopee&#xff09;作为一家知名的跨境电商平台&#xff0c;为卖家提供了丰富的销售机会。然而&#xff0c;…