【Rust中级教程】1.11. 生命周期(进阶) Pt.1:回顾、借用检查器、泛型生命周期

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

这篇文章在Rust初级教程的基础上对生命周期这一概念进行了补充,建议先看【Rust自学】专栏的第10章的文章。
请添加图片描述

1.11.1. 回顾

在初级教程中我们提到过:Rust里每个引用都有生命周期,它就是引用保持合法的作用域(scope),大多数时候都是隐式并且由编译器推断出来的。

对某个变量取得引用时生命周期开始,当变量移动或离开作用域时生命周期结束。也就是对于某个引用来说,它必须保持合法的一个代码区域的名称。

生命周期通常与作用域重合,但也不一定。

1.11.2. 借用检查器(Borrow Checker)

每当具有某个生命周期'a的引用被使用,借用检查器都会检查'a是否还存活。具体方法是:

  • 追踪路径到'a开始(获得引用)的地方
  • 从这开始,检查沿着路径是否存在冲突
  • 保证引用指向一个可安全访问的值

看个例子:

use rand::random;  
  
fn main() {  
    let mut x = Box::new(42);  
    let r = &x;  
    if random::<f32>() > 0.5 {  
        *x = 84;  
    } else {  
        println!("{}", r);  
    }  
}
  • xBox<i32>类型

  • r声明为x的引用,从这一行(第5行)开始引用的生命周期就开始了

  • 第7行对x进行了解引用修改值的操作,需要一个指向x的可变引用。借用检查器此时就会去出一个指向x的可变引用,并检查它的使用是否存在冲突,这个代码例中没有冲突,所以代码是合法的

  • 有人可能会问了:第7行在r的作用域里,*x需要指向x的可变引用,那在同一个作用域里既有不可变引用r和可变引用*x违反了借用规则不应该报错吗?
    事实上Rust很聪明,知道代码如果走了if分支就不能走else分支了,rif分支下根本就没有使用过,所以在if分支下使用*x这个可变引用是没有问题的。换句话说,r的生命周期并没有延伸到if分支里。这就是生命周期通常不与作用域完全重合的例子

再看一个例子:

fn main() {  
    let mut x = Box::new(42);  
      
    let mut z = &x;  
    for i in 0..100 {  
        println!("{}", z);  
        x = Box::new(i);  
        z = &x;  
    }  
    println!("{}", z);  
}
  • xBox<i32>类型
  • zx的引用,从这行(第4行)生命周期就开始了
  • 第6行,循环中打印了z,使用到了z这个引用自然就会被借用检查器检查。这里没有什么问题,所以借用检查器不会报错
  • 第7行,x被重新赋值
  • 第8行,z被重新赋值,Rust会把新赋的这个引用视作是另一个引用,所以相当于第8行是新的生命周期,而原本的生命周期到7行就结束了
  • 之后的每次循环都是z = &x;这一行会开启一个新的生命周期。借用检查器因此不会报错

借用检查器的特性

借用检查器是保守的:如果不确定某个借用是否合法,借用检查器就会拒绝该借用。

借用检查器有时候会需要帮助来理解借用为什么是合法的,这就是Unsafe Rust存在的部分原因。

1.11.3. 泛型生命周期

有时候我们需要在自己的类型里储存引用。我们就需要给这些引用标注生命周期,以便借用检查器检查合法性。例如在类型方法中返回引用,且存活时间比self长。

Rust允许你基于一个或多个生命周期将类型的定义泛型化。

两点提醒

  • 如果类型实现了Drop trait,那么丢弃类型时,就被记作是使用了类型所泛型的生命周期或类型。如果类型没有实现Drop trait,那么类型丢弃时不会当作使用了生命周期,可以忽略类型内的引用。
    举个例子:某个类型实例要被丢弃了,在丢弃之前,借用检查器会查看是否仍然合法地去使用你类型的泛型生命周期,因为你在drop函数中的代码可能会用到这些引用

  • 类型可泛型多个生命周期,但通常没必要让类型签名变得更复杂。只有类型包含多个引用时,你才应该使用多个生命周期参数,并且返回的引用只应绑定到其中一个引用的生命周期。

看个例子:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {  
    if x.len() > y.len() {  
        x  
    } else {  
        y  
    }  
}

'a表示有a这么一个生命周期,xy以及返回类型都是这个生命周期a,这个时候就表示xy和返回类型的生命周期是一样的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库

DeepSeek R1模型的Linux服务器搭建、API访问及Web页面搭建 1&#xff0c;引言2&#xff0c;安装Ollama工具3&#xff0c;下载DeepSeek R1 模型4&#xff0c;DeepSeek命令行对话5&#xff0c;DeepSeek API接口远程调用6&#xff0c;DeepSeek结合Web-ui实现图形化界面远程访问6.1…

【免费软件分享】Typor1.9.5-x64-CN免费版

到处找pojie软件的朋友&#xff0c;这里给大家提供一个版本&#xff0c;之前也是废了老大的劲才找到&#xff0c;这里分享给大家&#xff0c;希望帮助到需要的朋友&#xff01; Typor1.9.5-x64-CN&#xff1a; 我用夸克网盘分享了「Typor1.9.5-x64-CN.7z」&#xff0c;点击链接…

Python天梯赛刷题-五分题(上)

蓝桥杯题刷的好累&#xff0c;感觉零帧起手、以题带学真的会很吃力&#xff0c;打算重新刷一点天梯的题目巩固一下&#xff0c;我本人在算法非常不精通的情况下&#xff0c;自认为天梯的L1的题是会相对容易一些的&#xff0c;可能有一些没有脑子光靠力气的“硬推”hhhh。 从头…

Python编程之数据分组

有哪些方式可以进行数据分组利用Pandas库进行分组使用itertools库的groupby分组操作构建Python字典方式实现(小规模数据,不适用数量特别大的情况,不需要依赖其它python库)利用NumPy的groupby函数分组操作利用Python的Dask库提供的函数进行分组下面看一个如何去实现坐标数据…

激光雷达YDLIDAR X2 SDK安装

激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.html‌YDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器&#xff0c;具有以下主要特点和规格参数‌&#xff1a; ‌测距频率‌&#xff1a;3000Hz ‌扫描频…

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2) 我们上次已经了解了Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 今天&#xff0c;我们继续快速了解下最近比…

⭐ Unity 横向滑动列表 首尾相连 轮转图

效果如下&#xff1a; 场景挂载&#xff1a; 代码部分&#xff1a; using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using System.Drawing.Printing; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine…

大白话实战Sentinel

Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…

【C语言】C语言 哈夫曼编码传输(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 C语言 哈夫曼编码传输&#xff08;源码数据文件&am…

用命令模式设计一个JSBridge用于JavaScript与Android交互通信

用命令模式设计一个JSBridge用于JavaScript与Android交互通信 在开发APP的过程中&#xff0c;通常会遇到Android需要与H5页面互相传递数据的情况&#xff0c;而Android与H5交互的容器就是WebView。 因此要想设计一个高可用的 J S B r i d g e JSBridge JSBridge&#xff0c;不…

3月营销日历:开启春日盛宴,绽放生活魅力

关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰&#xff1a;如轻薄外套、春装等&#xff0c;适合惊蛰后的市场需求&#xff1b; 美妆护肤&#xff1a;妇女节期间&#xf…

GPT-SoVITS更新V3 win整合包

GPT-SoVITS 是由社区开发者联合打造的开源语音生成框架&#xff0c;其创新性地融合了GPT语言模型与SoVITS&#xff08;Singing Voice Inference and Timbre Synthesis&#xff09;语音合成技术&#xff0c;实现了仅需5秒语音样本即可生成高保真目标音色的突破。该项目凭借其开箱…

AI芯片:科技变革的核心驱动力

近年来&#xff0c;人工智能&#xff08;AI&#xff09;的飞速发展对众多行业产生了深远影响&#xff0c;芯片领域也不例外。AI在芯片设计、制造及应用等方面带来了革新性的改变&#xff0c;成为推动芯片行业发展的关键力量。 AI助力芯片设计效率飞升 传统芯片设计极为复杂&am…

【phpstudy】关于实现两个不同版本的mysql并存。

1.首先是先安装好两个版本的mysql mysql5.7用默认的就行 2.更改mysql8.0的配置&#xff0c;如图 3.找到mysql8.0的路径&#xff0c;看着个里面就可以知道了 4.进入后&#xff0c;可以把data里面的数据情况&#xff0c;就是把data文件夹里的东西删除&#xff08;我是先备份好了一…

Coze扣子新功能详解

今晚(2025-01-24)扣子再次进行更新 主要更新内容&#xff1a; 搭建小程序和 H5 用户界面时&#xff0c;支持使用音频组件播放音频内容 数据库操作体验提升 界面优化&#xff1a;对数据库详情界面进行了重新设计&#xff0c;并将工作流运行数据库的测试数据位置从原工作流底…

Pytorch深度学习教程_3_初识pytorch

欢迎来到《PyTorch深度学习教程》系列的第三篇&#xff01;在前面的两篇中&#xff0c;我们已经介绍了Python及numpy的基本使用。今天&#xff0c;我们将深入探索PyTorch的核心功能&#xff0c;帮助你更好地理解和使用这个强大的深度学习框架。 欢迎订阅专栏&#xff1a; 深度…

第4章 信息系统架构(二)

4.2 系统架构 信息系统架构是一种体系结构&#xff0c;它反映了一个组织信息系统的各个组成部分之间的关系&#xff0c;以及信息系统与相关业务、信息系统与相关技术之间的关系。 4.2.1 架构定义 对于大规模的复杂系统来说&#xff0c;对总体的系统结构设计比起对计算算法和…

剑指 Offer II 024. 反转链表

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20024.%20%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8/README.md 剑指 Offer II 024. 反转链表 题目描述 给定单链表的头节点 head &#xff0c;请反转链表&#xff…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…