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 编辑

目录
相关文章
|
Cloud Native Docker 容器
云原生之使用Docker部署Booksonic有声读物平台
云原生之使用Docker部署Booksonic有声读物平台
925 1
|
网络协议 安全 Shell
在Shell中,常见的网络操作命令
在Shell中,常见的网络操作命令
580 5
|
6月前
|
缓存 监控 API
1M 上下文不是免费午餐:超过 200K 输入价格翻倍,怎么算账怎么控
Opus 4.6 首次为旗舰模型开放1M上下文,但输入超200K token即触发全请求价格翻倍(输入$10→$5/MTok,输出$37.5→$25/MTok)。需精准监控总输入token(含cache相关),善用RAG、裁剪、缓存与Batch API控本。
1690 4
|
10月前
|
传感器 编解码 数据挖掘
ASTER 全球数字高程模型 V003
ASTER GDEM V3由NASA与METI合作开发,提供全球陆地高程数据,空间分辨约30米,覆盖北纬83°至南纬83°。基于188万景ASTER影像自动生成,含DEM与场景数图层,数据经云掩膜、异常值去除及多源融合优化,适用于地形分析,但可能存在局部伪影。
672 1
|
人工智能 前端开发 Java
用git rebase命令合并开发阶段中多条commit提交记录
通过 `git rebase`,可以合并多个提交记录,使开发历史更简洁清晰。操作分为 6 步:查看提交历史 (`git log --oneline`)、设置需合并的提交数 (`git rebase -i HEAD~N`)、修改动作标识为 `s`(squash)、保存退出编辑、调整提交信息、强制推送至远程仓库 (`git push -f`)。此方法适合清理本地无关提交,但若有团队协作或冲突风险,需谨慎使用以避免问题。
2783 60
|
数据处理
《原子操作:程序世界里的“最小魔法单位”解析》
在计算机编程中,原子操作是解决并发和多线程问题的关键。它指在执行过程中不会被其他操作中断的操作,确保数据处理的完整性和一致性。本文深入探讨了原子操作的概念、重要性、与普通操作的区别、应用场景及局限性,帮助读者更好地理解和应用这一核心技术。
696 3
|
中间件
eggjs 怎么使用 egg-jwt 实现登录验证中间件?
eggjs 怎么使用 egg-jwt 实现登录验证中间件?
931 104
eggjs 怎么使用 egg-jwt 实现登录验证中间件?
|
安全 数据可视化 数据挖掘
医院定位导航系统:技术革新助力医院安全管理与运营效率双重提升
医疗定位导航系统不仅集成了高精度的定位技术,还融合了人员定位、安全预警等多元化功能,为医院管理、患者就医及医护人员工作提供了全方位的支持。
671 1
医院定位导航系统:技术革新助力医院安全管理与运营效率双重提升
|
网络协议 安全
深入了解传输控制协议(TCP)
【8月更文挑战第24天】
945 0
|
Java 编译器 开发者
Java演进问题之AOT编译在Java中实现起来困难如何解决
Java演进问题之AOT编译在Java中实现起来困难如何解决
543 0