Rust生命周期简介

news/2024/4/20 9:28:58/文章来源:https://blog.csdn.net/weixin_45730130/article/details/128105828

Rust生命周期简介

Rust 中的每一个引用都有其 生命周期lifetime),也就是引用保持有效的作用域。

生命周期的主要目标是避免悬垂引用,它会导致程序引用了非预期引用的数据。

{let r;{let x = 5;r = &x;}//x出作用域后已经被删除,发生悬垂引用println!("r: {}", r);
}

实现生命周期检查的手段:Rust 编译器有一个 借用检查器borrow checker),它比较作用域来确保所有的借用都是有效的。

//函数中的泛型生命周期
fn longest(x: &str, y: &str) -> &str {if x.len() > y.len() {x} else {y}
}
//该函数会发生编译错误,因为 Rust 并不知道将要返回的引用是指向 x 或 y
//当我们定义这个函数的时候,并不知道传递给函数的具体值,所以也不知道到底是 if 还是 else 会被执行。
//我们也不知道传入的引用的具体生命周期,所以也就不能通过观察作用域来确定返回的引用是否总是有效。
//借用检查器自身同样也无法确定,因为它不知道 x 和 y 的生命周期是如何与返回值的生命周期相关联的。

生命周期标注语法:

生命周期语法是用于将函数的多个参数与其返回值的生命周期进行关联的。一旦他们形成了某种关联,Rust 就有了足够的信息来允许内存安全的操作并阻止会产生悬垂指针亦或是违反内存安全的行为。

Q:为什么有这个语法?

A:因为编译器笨,借用检查器不知道类似上述情况中的生命周期怎么比较,所以靠人手写给他约束。

生命周期标注并不改变任何引用的生命周期的长短。与当函数签名中指定了泛型类型参数后就可以接受任何类型一样,当指定了泛型生命周期后函数也能接受任何生命周期的引用。生命周期标注描述了多个引用生命周期相互的关系,而不影响其生命周期

生命周期标注有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。'a 是大多数人默认使用的名称。生命周期参数标注位于引用的 & 之后,并有一个空格来将引用类型与生命周期标注分隔开。

//使用泛型生命周期标注语法解决上述问题
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() {x} else {y}
}
//现在函数签名表明对于某些生命周期 'a,函数会获取两个参数,他们都是与生命周期 'a 存在的一样长的字符串 slice。
//函数会返回一个同样也与生命周期 'a 存在的一样长的字符串 slice。
//它的实际含义是 longest 函数返回的引用的生命周期与传入该函数的引用的生命周期的较小者一致。
//这就是我们告诉 Rust 需要其保证的约束条件。//两个直观的例子
//1.正确示例:返回的引用生命周期与较小的string2一致,函数调用正确
fn main() {let string1 = String::from("long string is long");{let string2 = String::from("xyz");let result = longest(string1.as_str(), string2.as_str());println!("The longest string is {}", result);}
}
//2.错误示例:返回的引用生命周期与string2一致,但是println时,result引用生命周期已经结束,编译失败
fn main() {let string1 = String::from("long string is long");let result;{let string2 = String::from("xyz");result = longest(string1.as_str(), string2.as_str());}println!("The longest string is {}", result);
}

类似的,结构体,方法中使用到引用时也可以使用生命周期标注语法。

题外话:Rust观法有在尽力的减轻开发者负担,一些很常见的需要生命周期标注的情况,编译器已经在内部实现好了,未来用户只会越来越少的使用到生命周期标注语法。被Rust 官方考虑到的一些引用分析的模式被称为 生命周期省略规则lifetime elision rules)。

比较特殊的,'static,其生命周期能够存活于整个程序期间。所有的字符串字面量都拥有 'static 生命周期。

//static生命周期
let s: &'static str = "I have a static lifetime.";

总结:

生命周期概念和大多数语言一样,但Rust对变量生命周期的检查是很具有特色的,还有他特别的生命周期标注语法是很性新颖的,能在编译期处理的错误绝不留到运行时这是Rust很棒的设计理念.

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

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

相关文章

Quartz深度实战

概述 Java语言中最正统的任务调度框架&#xff0c;几乎是首选。后来和Spring Schedule平分秋色&#xff1b;再后来会被一些轻量级的分布式任务调度平台&#xff0c;如XXL-Job取代。另外近几年Quartz的维护和发布几乎停滞&#xff0c;但这并不意味着Quartz被淘汰&#xff0c;还…

【SVM时序预测】基于matlab鲸鱼算法优化支持向量机SVM时序数据预测【含Matlab源码 2250期】

⛄一、鲸鱼算法优化支持向量机SVM 1 鲸鱼优化算法 WOA是由Mirjalili和Lewis在2016年提出的一种较为新颖的元启发式群体智能优化算法&#xff0c;该算法模仿座头鲸的“螺旋气泡网”捕食策略&#xff0c;如图1所示。 图1 座头鲸“螺旋起泡网”捕食策略 WOA算法寻优步骤如下。 步…

【在线研讨会】12月12日Softing工业物联网解决方案 助力工业4.0

本次研讨会设有抽奖环节&#xff0c;并有精美礼品相送&#xff01; 一 会议介绍 水平和垂直通信一体化是工业4.0背后的核心原则之一&#xff0c;实现这一点需要标准化通信接口&#xff0c;这些接口能够促进各种组件的相互连接并传输同步数据流。本次研讨会将提供解决方案将过程…

《联邦学习实战—杨强》之使用Python从零开始实现一个简单的横向联邦学习模型

文章目录前言环境准备完整代码配置文件(conf.json)获取数据集(datasets.py)获取PyTorch中自带深度学习网络预训练模型(models.py)客户端(client.py)服务端(server.py)main.py运行知识点补充argparse基本用法tensor.copy_()[Python dict() 函数](https://www.runoob.com/python/…

域自适应——Bidirectional Learning for Domain Adaptation of Semantic Segmentation

论文题目&#xff1a;Bidirectional Learning for Domain Adaptation of Semantic Segmentation 本文的域位移是针对虚拟数据和真实数据之间的。 本文的贡献是&#xff1a; 提出了一种语义分割的双向学习系统 &#xff0c;其是一个学习分割适应模型和图像翻译模型的闭环学习系…

nVisual部署之nginx配置说明

Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;因此nvisual在部署前端包时便采用了它作为服务器&#xff0c;版本使用1.14.1以上。在默认的配置下&#xff0c;还需要向nginx各模块添加配置才能达到生产需要。 接下来&#xff0c;从http模块开始&#xff0c;再到ser…

谷粒商城1.项目简介和项目环境预搭建(项目概述和环境搭建代码)

一.商城项目总体架构 从讲课篇看 从分块来看 项目知识概述 二.环境搭建代码 1.项目架构 建立父工程 pom文件 <description>聚合服务</description><packaging>pom</packaging><modules><module>gulimall-coupon</module><mo…

第七章 贝叶斯分类器(上)

7.1 贝叶斯决策论 贝叶斯决策论是概率框架下实施决策的基本方法。 假设有N种可能的类别标记&#xff0c;即y{c1,c2,…,cn}&#xff0c;λij是将一个真实标记为cj的样本误分类为ci所产生的损失。基于后验概率P(ci | x)可获得将样本x分类为ci所产生的期望损失&#xff0c;即在样…

从电商到超市,美团的零售之变

从上海回到湖南长沙县的时候&#xff0c;何靓做好了过“苦日子”的准备。作为一个湖南人&#xff0c;她知道县城往往意味着没有星巴克和喜茶&#xff0c;意味着仅有的一两座电影院环境不太好&#xff0c;意味着每天晚上九点后连便利店都大门紧闭。 但在真正回到这“半个故土”…

品牌投资与形象全面升级 | 快来认识全新的 Go 旅城通票

近日&#xff0c;Go 旅城通票&#xff08;Go City&#xff09;品牌全面升级&#xff0c;旨在提高旅游爱好者对品牌的认知。从新冠疫情大流行中阴霾中走出来的 Go 旅城通票复苏势头强劲&#xff0c;专注于技术提升&#xff0c;使命是协助旅游爱好者无论到世界各地的哪一个城市畅…

人工智能前沿——未来AI技术的五大应用领域

关注“PandaCVer”公众号 >>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、航空航天 二、医疗保健 三、建筑行业 四、能源领域 五、供应链 关于YOLO算法改进及论文投稿可关注并留言博主的CSDN/QQ >>>一起交流&#xff01;互相学习&…

【千瓜行研】2022年11.11小红书保健品行业数据研报

2022年双十一营销盛会已落下帷幕&#xff0c;小红书平台保健品行业流量连续3年持续走高&#xff0c;热度破亿&#xff01; 本期「千瓜行研」重磅推出《2022年11.11保健品行业数据研报&#xff08;小红书平台&#xff09;》&#xff08;文末附完整版下载&#xff09;&#xff0c…

Android 创建桌面组件Widget——构建应用微件(二)

Android 创建桌面组件Widget——构建应用微件&#xff08;二&#xff09;Android 创建桌面组件Widget——构建应用微件&#xff08;二&#xff09;概览使用 AppWidgetProvider 类接收应用微件广播 Intent固定应用微件设置预览图片完整代码Android 创建桌面组件Widget——构建应…

LVS-DR模式单网段和多网段案例实现

1 实验环境&#xff1a; 一台&#xff1a;客户端 eth0:仅主机 192.168.10.8/24 GW:192.168.10.18一台&#xff1a;ROUTER eth0 :NAT 192.168.100.18/24 eth1: 仅主机 192.168.10.18/24 启用 IP_FORWARD一台&#xff1a;LVS eth0:NAT:DIP:192.168.100.48/24 GW:192.168.100.18两…

大数据必学Java基础(一百零八):过滤器的生命周期

文章目录 过滤器的生命周期 一、构造方法 二、初始化方法 三、拦截请求方法

【AI学习笔记】TensorFlow GPU版本的安装(超详细)

安装步骤&#xff1a;1. 确认显卡是否支持CUDA2. 安装CUDA3. 安装cuDNN3.1 安装 cudnn3.2 将cudnn64_8.dll存放的位置加入Path环境变量4. 安装TensorFlow GPU版本4.1 在Anaconda建立TensorFlow GPU虚拟环境4.2 安装Tensorflow-gpu4.3 安装Keras总结1. 确认显卡是否支持CUDA 在…

供应荧光染料AF532 活性酯,AF532-NHS,CAS:477876-64-5

一&#xff1a;产品描述 1、名称 AF5 532酯 AF532-NHS AF532 活性酯 Alexa Fluor 532 AF532 NHS ester 2、CAS编号&#xff1a;477876-64-5 3、分子式&#xff1a;C34H33N3O11S2 4、分子量&#xff1a;723.77 5、质量控制&#xff1a;95% 6、储存&#xff1a; -20…

Arduino开发实例-DIY酒精浓度检测计

DIY酒精浓度检测计 在本文中,将详细介绍如何创建一个简单的酒精检测器。 它可以在各种应用领域中使用。市场上有许多先进的酒精传感器,价格合理,但我们在这里使用一些基本的微控制器来制作这个项目,如 Arduino、LED、蜂鸣器和 MQ3 酒精传感器。 1、MQ-3传感器介绍 MQ-3传…

A*算法-Python实现

好久没有在CSDN上发文章了&#xff0c;快一年了吧。这两天重新登录了一下&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;没想到访问量快13万了。 之前写博客的时候&#xff0c;想着把一些有用的东西写下来&#xff0c;一方面是当做笔记了&#xff0c;免得以后忘记…

5G无线技术基础自学系列 | SU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 通过多天线技术支持单用户在上下行数据…