生命周期标注

fn main() {let r;{let x = 5;r = &x}print!("r:{}", r);
}

let r 这种初始化的方式在RUST中是被允许的,过程中程序声明了两个变量xr,程序无法正常编译。

x does not live long enough 编译报错的原因:被引用对象的存活时间短语引用者。r对象的生命周期标注为'ax对象的生命周期为'b,对象x会在离开作用域时被销毁,'b的声明周期要比'a的声明周期短。

fn main() {let s1 = String::from("abcd");let s2 = "xyz";let result = longest(s1.as_str(), s2);print!("The longest string is {}", result)
}fn longest(x: &str, y: &str) -> &str {if x.len() > y.len() {x} else {y}
}

longest接收两个字符串切片类型做入参,并返回较长的那一个切片。在main中调用这个方法验证执行结果。

但程序无法通过编译:missing lifetime specifier。我们需要给longest返回类型标注一个生命周期参数,引入RUST并不确定返回的引用会指向x还是指向y

RUST中函数体返回一个引用类型,一定也存在引用类型的参数。如果返回的引用没有指向任何参数,那么它可能指向了一个创建于函数内部的值,由于这个值会因为函数结束而离开作用域,所以返回的内容也就变成了悬垂引用。

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

声明周期的标注使用一种明显不同的语法:它的参数名称必须以撇号(')开头,且通常使用小写字符。

在函数体后增加<'a>来声明生命周期标注,声明之后才可以在参数和返回值中使用。单个生命周期的标注本身没有太多意义,标注只所以存在是为了向RUST描述多个泛型生命周期之间的关系。例子中生命周期的的标注意味着:参数xy和返回值生命周期必须是有交集的。

函数签名表明,函数所获取的两个字符串切片参数的存活时间、以及返回的字符串切片存活时间必须不短于给定的生命周期'a。记住,当我们在函数签名中指定生命周期参数时,我们并没有改变任何传入值或返回值的声明周期。我们只是向借用检查器指出了一些可以用于检查非法调用的约束。

当我们将具体的引用传入longest时,被用于替代'a的具体生命周期就是作用域x与作用域y重叠的一部分。泛型生命周期'a会被具象化为xy两者中声明周期较短的那一个。

&i32          // 引用
&'a i32       // 拥有显示声明周期的引用
&'a mut i32   // 拥有显示声明周期的可变引用

生命周期声明只会出现在引用的类型中,形如&'a,我们将声明周期参数的标注填写在&运算符之后,并通过一个空格符来将标注和引用区分开来。

总的来说,如果我们不使用引用,而使用持有自身所有权的数据类型,就不需要做泛型生命周期声明。

结构体定义中的生命周期标注

结构体的字段也可以声明引用类型,不过需要为结构体定义中的每一个引用都添加生命周期标注。

struct ImportantExcerpt<'a> {part: &'a str,
}impl<'a> ImportantExcerpt<'a> {fn announce_and_return_part(&self, announcement: &str) -> &str {println!("Attention please:{}", announcement);self.part}
}

如同泛型数据类型一样,为了在结构体定义中使用生命周期参数,我们需要在结构体名称后的尖括号内声明泛型周期参数的名字。这个标注意味这ImportantExcerpt实例的存活时间不能超过存储在part中的引用的存活时间。

结构体字段中的生命周期名字总是需要被声明在impl关键字之后,并被用于结构体名称之后,因为这些生命周期属于结构体类型的一部分。

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

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

相关文章

用HeidiSQL在MySQL中创建新的数据库

用有权限的用户登录&#xff1a; 右键单击&#xff0c;选择&#xff1a; 输入要创建的数据库名称&#xff0c;然后点击“确定”&#xff1a; 刷新下&#xff0c;就看到新创建的数据库了&#xff1a; 在新创建的数据库中&#xff0c;就可以做其它操作了&#xff0c;例如…

docker 切换镜像源

Dockerfile build 报错了&#xff1a; WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.18/main: temporary error (try again later) WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.18/community: 这个问题是默认的 Alpine Linux 的软件包镜像源…

uniapp微信小程序实现地图展示控件

最终实现效果&#xff1a; 地图上展示控件&#xff0c;并可以点击。 目录 一、前言 二、在地图上展示控件信息 点击后可进行绘制面图形 1.使用cover-view将控件在地图上展示 2.设置控件样式&#xff0c;使用好看的图标 3.控件绑定点击事件 一、前言 原本使用的是control…

Android 11.0 所有音量默认为最大音量值

Android 11.0 所有音量默认为最大音量值 最近接到邮件需求想要将设备的所有音量的音量值默认为最大&#xff0c;修改默认音量值是在AudioSystem.java中的修改&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/media/java/android/media/AudioSystem.java /// M: m…

nginx 配置前端项目添加https

可申请阿里云免费证书 步骤省略… nginx 配置 server {listen 8050; #默认80端口 如果需要所有访问地址都是https 需要注释listen 8443 ssl; #https 访问的端口 &#xff0c;默认443server_name 192.168.128.XX; #域名 或 ip# 增加ssl#填写证书文件…

Java多线程-第20章

Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中&#xff0c;线程是一种轻量级的子进程&#xff0c;它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现&#xff1a;继承Threa…

IntelliJ IDEA安装使用教程

IntelliJ IDEA是一个流行的Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它是一款全功能的IDE&#xff0c;支持多种编程语言&#xff0c;如Java、Kotlin、Groovy、Scala、Python、JavaScript、HTML、CSS等等。IntelliJ IDEA 提供了高效的代码…

Pytorch在二进制层面比较张量中的各行是否相同,并返回不相同的各行

代码实例&#xff1a; def unique(arr):# Finds unique rows in arr and return their indicesarr arr.cpu().numpy()arr_ np.ascontiguousarray(arr).view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))_, idxs np.unique(arr_, return_indexTrue)if torch.cu…

代码随想录算法训练营 ---第五十一天

1.第一题&#xff1a; 简介&#xff1a; 本题相较于前几题状态复杂了起来&#xff0c;因为多了一个冷冻期。本题讲解可去代码随想录看&#xff0c;这里差不多只是加了些自己的理解。 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组以及下标的含义 dp[i][j]&#x…

C#文件流二进制文件的读写

目录 一、BinaryWriter类 二、BinaryReader类 三、示例 1.源码 2.生成效果 二进制文件的写入与读取主要是通过BinaryWriter类和BinaryReader类来实现的。 一、BinaryWriter类 BinaryWriter类以二进制形式将基元类型写入流&#xff0c;并支持用特定的编码写入字符串&#…

(五)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

使用Pytorch从零开始实现CLIP

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

sublime Text使用

1、增加install 命令面板 工具(tool)->控制面板(command palette) -> 输入install ->安装第一个install package controller&#xff0c;以下安装过了&#xff0c;所以没展示 2、安装json格式化工具 点击install package&#xff0c;等几秒会进入控制面板&#xff0…

润申信息企业标准化管理系统 SQL注入漏洞复现

0x01 产品简介 润申信息科技企业标准化管理系统通过给客户提供各种灵活的标准法规信息化管理解决方案&#xff0c;帮助他们实现了高效的标准法规管理&#xff0c;完成个性化标准法规库的信息化建设。 0x02 漏洞概述 润申信息科技企业标准化管理系统 CommentStandardHandler.as…

高级I/O 基础概念

文章目录 什么是高级I/O五种常见高级I/O同步IO和异步IO多路转接是异步IO吗 什么是高级I/O 高级I/O&#xff08;Advanced I/O&#xff09;是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。它提供了比传统的基本I/O操作更丰富和灵活的功能&#xff0c;以满…

echarts实现3D柱状图

效果如图 let setData function(data, constData, showData) {data.filter(function(item) {if (item) {constData.push(1);showData.push(item);} else {constData.push(0);showData.push({value: 1,itemStyle: {normal: {borderColor: "rgba(0,0,0,0)",borderWidt…

Day2 数组(二)

​ day2 2023.11.30 代码随想录 1. 977有序数组的平方 第二天做题就遇到点问题了&#xff0c;首先对于该题&#xff0c;简单的暴力平方排序肯定没问题&#xff0c;但一定不是我们要的最优解&#xff0c;我们争取在O(n)的时间复杂度内解决问题&#xff0c;发现对于一个初始数组…

传统算法:使用 Pygame 实现线性查找

使用 Pygame 模块实现了线性查找的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过线性查找算法对数组进行查找,动画效果可视化每一步的变化。在查找的过程中,程序逐个遍历数组元素,如果找到目标值,将相应的元素高…

HarmonyOS应用开发者基础认证试题

判断题 1.Ability是系统调度应用的最小单元&#xff0c;是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。(true) 2.Tabs组件仅可包含子组件TabsContent&#xff0c;每一个页签对应一个内容视图即TabContet组件。(true) 3.使用http模块发起网络请求时&#…

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系&#xff0c;并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等&#xff0c;由于opentelemetry的存在&#xff0c;都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…