Rust语言入门(第3篇)

引用与借用

上一篇中,我们介绍了rust的所有权概念,若直接传递变量做函数参数,堆上的变量就会失去所有权,而栈上变量则由于复制,仍有所有权。

fn main(){let b = 3;makes_copy(b);println!("after using a variable in stack {}", b);let a = String::from("hello");take_ownership(a);// a 已被moveprintln!("after using a variable in heap {}", a);
}
fn take_ownership(a:String){println!("{}",a);
}
fn makes_copy(a:i32){println!("{}",a);
}

Rust对引用的定义,即指针,实现类似于C中的取地址&,

let x = 3;
// y即x的引用
let y = &x;
// 必须解引用,否则类型不一致
assert_eq!(3,*y);

用引用类型参数代替上一篇的原参数,且默认是不可变的,
若要修改引用,则要加上可变声明,注意看变量声明、函数声明、函数调用入参形式

fn main(){let mut a = String::from("Hello");cal_len(&mut a);println!("{}",a);
}
fn cal_len(a:& mut String) -> (){a.push_str(", world!");
}

可变引用同时只能有一个
这是为了避免数据竞争,在C++多线程程序中,使用互斥锁避免争抢操作同一块内存,而Rust直接限制数据竞争。

let mut s = String::from("hello");let r1 = &mut s;
let r2 = &mut s;
// r1结束前,声明可变引用r2导致重复可变应用,编译报错
println!("{}, {}", r1, r2);

引用作用域的结束位置是该变量最后一次使用的位置

Rust避免了悬垂引用,即避免出现指针原指向的对象已被清除,但指针仍存在的风险。

fn main() {let reference_to_nothing = dangle();
}
// 如下函数错误,因为a已经被清除
fn dangle() -> &String {let a = String::from("hello");&a
}

总结,
同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用。
引用必须总是有效的。
如下来自 AI助手,

  1. 静态类型:Rust是一种静态类型语言,变量在声明时必须指定其类型,并且一旦指定,类型不能更改。

  2. 强类型:Rust是一种强类型语言,变量不能隐式地转换为其他类型,必须使用类型转换来显式地进行转换。

  3. 不可变性:Rust默认情况下变量是不可变的,即不能修改其值。如果需要修改变量的值,需要使用 mut 关键字来声明可变变量。

  4. 所有权:Rust中的变量具有所有权,每个值都有一个唯一的拥有者。当拥有者超出作用域时,值将被销毁。

  5. 解引用和引用:Rust中可以使用 & 符号来引用变量,以便在不拥有所有权的情况下访问其值。通过解引用操作符 *,可以使用引用来访问变量的值。

  6. 可变性引用:在Rust中,可以通过借用变量来让其它代码可以读取和修改该变量的值,但是只能在特定范围内进行,并在借用结束后返回变量的所有权。

  7. 生命周期:Rust中的变量有一个生命周期,用于限定变量的有效范围。当变量超出其生命周期时,它将被销毁。

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

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

相关文章

STM32之USART

概述 串口通信,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter ),简称UART;而USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步收发传输器。 USAR…

python学习笔记 -- 字符串

目录 一、输出字符串的格式 二、字符串的一些函数 1、len函数:字符串长度 2、查找字符所在位置index 3、某字符在字符串中的个数count 4、字符切片 对字符串进行翻转 -- 利用步长 5、修改大小写字母: 6、判断开头和结尾 7、拆分字符串 一、输出…

Transformer实战-系列教程13:DETR 算法解读

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列,开山之作&…

点云——噪声(代码)

本人硕士期间研究的方向就是三维目标点云跟踪,对点云和跟踪有着较为深入的理解,但一直忙于实习未进行梳理,今天趁着在家休息对点云的噪声进行梳理,因为预处理对于点云项目是至关重要的,所有代码都是近期重新复现过。 这…

2022年全国青少年信息素养大赛 第8届Python编程挑战赛(小学组)复赛试题解析

2022年全国青少年信息素养大赛 第8届Python编程挑战赛(小学组)复赛试题解析T1. 分草莓 小明邀请了四个同学一起游玩,带了一盒草莓平均分给大家一起吃,任意输入草莓的数量n,输出每个人可以分到几颗草莓,最后剩下了几颗。 注意: input()内不添加任何参数 只有完全正确才可…

shell脚本之无限计时器

无限计时器 a0while : dolet aecho $asleep 1 done新建一个.sh结尾的文件复制粘贴进去即可使用!

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料,是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能,方便学生在学习中进行文档编写、合作项…

Qt安装配置教程windows版(包括:Qt5.8.0版本,Qt5.12,Qt5.14版本下载安装教程)(亲测可行)

目录 Qt5.8.0版本安装教程Qt5.8.0版本下载安装 Qt5.12.2版本安装教程下载安装 Qt 5.14.2安装教程下载安装和创建项目 参考视频 QT为嵌入式系统提供了大量的库和可重用组件。 WPS Office,咪咕音乐,Linux桌面环境等都是QT开发的。 Qt5.8.0版本安装教程 Q…

Kotlin手记(一):基础大杂烩

Kotlin简介 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言 2012年2月,JetBrains以Apache 2许可证开源此项目。 2016年2月15日,Kotlin v1.0发布,这被认为是第一个官方稳定版本。 在Google I/O 2017中&am…

探索Spring Validation:优雅实现后端数据验证的艺术

在现代Web应用开发中,数据验证是一项至关重要的任务,确保应用程序接收到的用户输入符合预期规范,不仅能够提高系统的健壮性,也能有效防止潜在的安全漏洞。Spring Framework通过其内置的Spring Validation模块,为我们提…

机器学习系列——(十一)回归

引言 在机器学习领域,回归是一种常见的监督学习任务,它主要用于预测数值型目标变量。回归分析能够通过对输入特征与目标变量之间的关系建模,从而对未知数据做出预测。 概念 回归是机器学习中的一种监督学习方法,用于预测数值型目…

yo!这里是Linux线程保姆级入门介绍

目录 前言 Linux线程基础 线程概念 底层示意图 线程vs进程 Linux线程控制 创建线程 线程ID 线程终止 线程等待 线程分离 Linux线程互斥 背景概念 互斥量mutex 1.相关接口 2.实现原理 可重入vs线程安全 死锁 Linux线程同步 条件变量 生产者消费者模型 基于…

文本格式和二进制格式的区别

聊聊字符集,我个人理解不管是文本数据UTF-8、GBK编码格式还是二进制数据,其实内存存储的永远都是“01”数据。二进制存储就是将内存“01”数据拷贝到磁盘里。文本在内存中也是“01”数据,存储文本数据就是将“01”数据拷贝到磁盘里。所以存储…

MacOS 查AirPods 电量技巧:可实现低电量提醒、自动弹窗

要怎么透过macOS 来查询AirPods 电量呢?当AirPods 和Mac 配对后,有的朋友想通过Mac来查询AirPods有多少电量,这个里有几个技巧,下面我们来介绍一下。 透过Mac 查AirPods 电量技巧 技巧1. 利用状态列上音量功能查询 如要使用此功能…

Linux 命令行的世界 :2.文件系统中跳转

我们需要学习的第一件事(除了打字之外)是如何在 Linux 文件系统中跳转。在这一章节中,我们将介绍以下命令:pwd 打印出当前工作目录名 cd 更改目录 ls 列出目录内容 Linux以分层目录结构来组织所有文件。这就意味着所有文件…

FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误: 源码: //fastjon log.info("\nRequest Info :{} \n", JSON.toJSONString(requestInfo)); //jackson …

人力资源智能化管理项目(day04:组织架构)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 树组件应用 <!-- 展示树形结构 --><!-- default-expand-all默认展开所有节点 --><el-tree default-ex…

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

面试高频知识点:2线程 2.1.6线程之间如何通信

线程之间的通信方式 在Java中&#xff0c;常见的线程之间通信方式包括&#xff1a; 共享内存&#xff1a;通过共享内存区域进行通信&#xff0c;即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。 消息传递&#xff1a;通过消息传递的方式进行通信…

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip&#xff1a; IDEA自带&#xff0c;非常好用。智能提示很强大&#xff0c;快捷键跟IDEA自身一致。 如果下载不了 DataGrip&#xff0c;也可以直接用 IDEA 自带的。 常用的快捷键 alt8&#xff1a; 打开数据库Service ctrlshiftF10&#xff1a;打开常用的数…