当前位置: 首页 > news >正文

Rust 生命周期

Rust 第17节 生命周期

先看一段错误代码

/*
//一段错误的代码
// Rust 编译时会报错;
*/let r;{let x = 5;r = &x;}println!("{}",r);

Rust 在编译时使用 借用检查器, 比较作用域来检查所有的借用是否合法;
很明显;r 引用了 x; 但是x 的生命周期比r短;所以就有问题;

再看下一段代码

fn logest(x : &str,y : &str) -> &str {if x.len() > y.len() {x} else {y        }
}

看着没有问题,但是编译器会报错;是由于,输入的两个引用,和输出的一个引用;这么多引用,编译器不知道他们的生命周期的关系;所以报错;

生命周期标注

解决方法:
手动标注生命周期

//需要手动指示生命周期; 简单理解就是返回值的生命周期和传入的参数周期一致,都是'a
fn logest<'a>(x : & 'a str,y : &'a str) -> & 'a str {if x.len() > y.len() {x} else {y        }
}

上边的方式为生命周期标注
生命周期的标注不会改变引用的生命周期长度
当指定了泛型生命周期参数,函数可以接收带有任何生命周期的引用
它的本质是描述多个引用的生命周期间的关系,但不影响生命周期

标注语法

生命周期标注语法
以 ’ 开头,全小写,很短;通常都使用 'a
在 & 后边,用空格与类型分开
上边例子中的’a 就是 x,y中较小的那个

结构体中的生命周期标注

// 当结构体的成员有引用时,就需要存在标注struct  Import<'a> {part : & 'a str,
}//这里表示 part的生命周期要和结构体一样长;

生命周期标注省略

任何引用都需要标注生命周期

有的标注编译器可以完成,所以不需要标注;
编译器通过三个方法来判断引用的生命周期,这三个方法的情况下,可以省略生命周期标注
适用于 fn 和 impl

  1. 应用于输入生命周期;(函数的传参)
    每个引用类型的参数都有自己的生命周期
  2. 应用于输出生命周期 (函数的返回值)
    如果只有一个输入生命周期参数,那么该生命周期都将赋给所有的输出生命周期参数
  3. 应用于输出生命周期 (函数的返回值)
    如果有多个输入参数生命周期参数,但其中一个是 &self 或 & mut self ;那么self 的生命周期将赋给所有的输出生命周期参数

静态生命周期

'static 是一个特殊的生命周期,表示的是 整个程序的持续时间。

http://www.lryc.cn/news/266524.html

相关文章:

  • 【论文解读】CNN-Based Fast HEVC Quantization Parameter Mode Decision
  • 在Linux上安装CLion
  • R语言贝叶斯网络模型、INLA下的贝叶斯回归、R语言现代贝叶斯统计学方法、R语言混合效应(多水平/层次/嵌套)模型
  • 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测
  • Oracle 学习(1)
  • 华为HCIA认证H12-811题库新增
  • Nginx Unit 1.27.0 发布
  • 【影像组学入门百问】#32—#34
  • YOLOv5代码解析——yolo.py
  • 4种feature classification在代码的实现上是怎么样的?Linear / MLP / CNN / Attention-Based Heads
  • 最新Unity DOTS Physics物理引擎碰撞事件处理
  • springboot集成websocket全全全!!!
  • SpringMVC:整合 SSM 中篇
  • oracle即时客户端(Instant Client)安装与配置
  • POP3协议详解
  • 电子病历编辑器源码,提供电子病历在线制作、管理和使用的一体化电子病历解决方案
  • WT2605C高品质音频蓝牙语音芯片:外接功放实现双声道DAC输出的优势
  • IntelliJ IDEA 2023.3 最新版如何如何配置?IntelliJ IDEA 2023.3 最新版试用方法
  • 如何查看内存卡使用记录-查看的设备有:U盘、移动硬盘、MP3、SD卡等-供大家学习研究参考
  • 九、W5100S/W5500+RP2040之MicroPython开发<HTTPOneNET示例>
  • 在 Laravel 中,清空缓存大全
  • 【贪心】单源最短路径Python实现
  • Spark Shell的简单使用
  • Springsecurty【2】认证连接MySQL
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • 谷粒商城-商品服务-新增商品功能开发(商品图片无法展示问题没有解决)
  • Open3D 点云数据处理基础(Python版)
  • 使用vue-qr,报错in ./node_modules/vue-qr/dist/vue-qr.js
  • 百川2大模型微调问题解决
  • MySQL的事务-原子性