Rust-引用借用规则

目录

一、概述

二、借用规则

三、详细解释

[3.1 第一条规则](#3.1 第一条规则)

[3.2 第二条规则](#3.2 第二条规则)

[3.3 第三条规则](#3.3 第三条规则)

四、总结


Welcome to Code Block's blog

本篇文章主要介绍了

**Rust-引用借用规则**

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

一、概述

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

二、借用规则

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

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

三、详细解释

3.1 第一条规则

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


|不可变引用A

|

|其它不可变引用

|

|使用不可变引用A


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

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

3.2 第二条规则

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


//可变引用A

//

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

//

//使用可变引用A


或者


//不可变引用A

//

//任何A的可变引用

//

//使用不可变引用A


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

第一种情况:

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

第二种情况:

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

3.3 第三条规则

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

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

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

如下:

rust 复制代码
    let mut A = 1;
    //可变引用a
    let a = &mut A;
    //引用b为不可变引用
    let b = & *a; //借引用a

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

四、总结

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

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

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

相关推荐
程序猿DD9 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i12 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要82612 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频13 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林13 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne14 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF14 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li15 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
顽疲15 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog15 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友