Rust-引用借用规则

简介: Rust为确保程序在运行时不会出现数据竞争和其他内存安全,在使用引用时有很多规则,我在第一眼看到这些规则时也是有些头大,看了一段时间后才有了一些自己的一些理解。在这里对一些官方的术语和借用规则进行解释和记录。

 目录

一、概述

二、借用规则

三、详细解释

3.1 第一条规则

3.2 第二条规则

3.3 第三条规则

四、总结


Welcome to Code Block's blog

本篇文章主要介绍了

[Rust-引用借用规则]

❤博主广交技术好友,喜欢文章的可以关注一下❤

一、概述

       Rust为确保程序在运行时不会出现数据竞争和其他内存安全,在使用引用时有很多规则,我在第一眼看到这些规则时也是有些头大,看了一段时间后才有了一些自己的一些理解。在这里对一些官方的术语和借用规则进行解释和记录。

二、借用规则

  • 同一时间可以有多个不可变引用(&T)。
  • 同一时间只能有一个可变引用(&mut T)。
  • 不可变引用和可变引用不能同时存在。

上面为官方的解释,难理解的问题出现在这个同一时间,怎么才算同一时间。其实这里说的同一时间时指同一生命周期内。

三、详细解释

3.1 第一条规则

       同一时间内可以有多个不可变引用(&T)。即在同一个范围的生命周期内,可以包含多个不可变的引用。

-------------------------------

|不可变引用A

|

|其它不可变引用

|

|使用不可变引用A

--------------------------------

如上图, 在不可变引用A的作用生命周期内,可以创建和使用多个不可变引用。实例代码:

let A = 1;
    //不可变引用a
    let a = &A;
    //其它不可变引用
    let b = &A;
    //....
    //使用不可变引用a
    println!("{}", &a);

image.gif

3.2 第二条规则

       同一时间只能有一个可变引用(&mut T)。即在同一个生命周期内只能有一个可变引用。

-------------------------------------

//可变引用A

//

//周期内不能包含A的不可变引用

//

//使用可变引用A

------------------------------------

或者

------------------------------------

//不可变引用A

//

//任何A的可变引用

//

//使用不可变引用A

-------------------------------------

       如上图,在可变引用A的生命周期内,不能包含A的任何不可变引用。或者在不可变引用A的生命周期内不能包含任何可变A的可变引用

第一种情况:

let mut A = 1;
    //可变引用a
    let a = &mut A;
    //其它不可变引用
    let b = &A;
    //....
    //使用可变引用a
    println!("{}", &a);

image.gif

第二种情况:

let mut A = 1;
    //不可变引用a
    let a = &A;
    //其它可变引用
    let b = &mut A;
    //....
    //使用不可变引用a
    println!("{}", &a);

image.gif

3.3 第三条规则

      不可变引用和可变引用不能同时存在。

       其实可以理解为对第二条规则的总结,不能同时存在即在同一个生命周期内不能同时存在对A的不可变引用和可变引用。

:对引用解引用即获取该引用的数据对象,如果再次引用即为借引用。这里需要注意对任何解引用的借引用都为不可变引用。

如下:

let mut A = 1;
    //可变引用a
    let a = &mut A;
    //引用b为不可变引用
    let b = & *a; //借引用a

image.gif

这里a为可变引用,b借引用a,但是b为不可变引用。生命周期内同样需要满足上述借用规则

四、总结

       Rust的借用规则虽然初看起来复杂,但通过合理组织代码结构和生命周期,可以有效地防止数据竞争和内存错误。理解“同一生命周期”的概念,以及如何在该生命周期内管理不可变和可变引用的使用,是掌握Rust借用系统的关键。这不仅提升了代码的安全性,也为编写高效的并发程序奠定了基础。随着对Rust的深入学习和实践,这些规则将逐渐成为编写稳健代码的自然习惯。

如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

image.gif 编辑

目录
相关文章
|
7月前
|
人工智能 数据挖掘 Linux
Centos安装Python3.7(亲测可用)
本指南详细介绍了在基于Linux(以CentOS系统为例,使用yum包管理器)的系统上安装Python 3.7版本的完整流程。Python是一种广泛使用的高级编程语言,在各种领域如软件开发、数据分析、人工智能和区块链开发等都有着重要的应用。
677 2
|
传感器 Rust 安全
为什么物联网领域使用Rust的项目越来越多?
2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。
为什么物联网领域使用Rust的项目越来越多?
|
11天前
|
存储 弹性计算 数据库
阿里云2026年第一波活动有哪些?云服务器抢购、满减券、免费试用都有
2026年阿里云推出多项优惠活动:轻量应用服务器2核2G峰值200M带宽38元抢购,云服务器“99计划”99元与199元新购续费同价;学生享300元无门槛券,教师享5折优惠;初创企业最高得100万上云抵扣金,企业迁云/出海可申5亿算力补贴;140+款云产品免费试用最长12个月,配合165元满减券包(满50减15、满180减50、满350减100),满足个人、企业全场景上云需求,助力个人、企业和学生用户优惠上云。
268 2
|
7月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
210 1
Linux系统性能调优技巧和相关工具
|
7月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
255 5
|
7月前
|
存储 JavaScript 区块链
小试牛刀-SOL链创建Token
最近需要编写SOL合约进行SPL Token的转移,因为在测试网上需要自己部署测试Token,同时为了更加美观,Token需携带metadata数据(对名称、头像等)进行定义.在此对创建过程进行记录,希望帮助到有需要实现相关功能的朋友.
142 1
|
7月前
|
存储 索引
rbpf虚拟机-opcode码
该篇文章是rbpf虚拟机opcode码作用和使用的整理。(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)
190 0
|
7月前
|
JSON API PHP
全球天气预报5天(经纬度版)免费API接口教程
本文介绍接口盒子提供的全球天气预报API,支持通过经纬度获取任意地区未来5天的详细天气数据,包含温度、气压、湿度、风速等12项气象要素。提供每3小时的精细化预报,个人开发者可免费调用(需注册获取KEY)。附请求参数、返回数据说明及PHP、Python调用示例,适用于气象平台、出行类APP、物联网监测等场景。
908 0
|
7月前
|
存储 人工智能 物联网
RFID技术成为现代资产管理重要桥梁
RFID技术助力资产管理智能化升级,通过非接触式识别、批量读取、高安全性等优势,实现资产全生命周期追踪与自动化管理。广泛应用于资产定位、库存盘点、防伪溯源、维护提醒等场景,显著提升管理效率、准确性与决策水平,降低运营成本。结合AI与大数据,推动企业数字化转型。
|
11月前
|
人工智能 前端开发 Java
用git rebase命令合并开发阶段中多条commit提交记录
通过 `git rebase`,可以合并多个提交记录,使开发历史更简洁清晰。操作分为 6 步:查看提交历史 (`git log --oneline`)、设置需合并的提交数 (`git rebase -i HEAD~N`)、修改动作标识为 `s`(squash)、保存退出编辑、调整提交信息、强制推送至远程仓库 (`git push -f`)。此方法适合清理本地无关提交,但若有团队协作或冲突风险,需谨慎使用以避免问题。
1914 60