Rust 生命周期

Rust 第17节 生命周期

先看一段错误代码

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

Rust 在编译时使用 借用检查器, 比较作用域来检查所有的借用是否合法;

很明显;r 引用了 x; 但是x 的生命周期比r短;所以就有问题;

再看下一段代码

rust 复制代码
fn logest(x : &str,y : &str) -> &str {
    if x.len() > y.len() {
        x
    } else {
        y        
    }
}

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

生命周期标注

解决方法:

手动标注生命周期

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

上边的方式为生命周期标注

生命周期的标注不会改变引用的生命周期长度

当指定了泛型生命周期参数,函数可以接收带有任何生命周期的引用

它的本质是描述多个引用的生命周期间的关系,但不影响生命周期

标注语法

生命周期标注语法

以 ' 开头,全小写,很短;通常都使用 'a

在 & 后边,用空格与类型分开

上边例子中的'a 就是 x,y中较小的那个

结构体中的生命周期标注

rust 复制代码
// 当结构体的成员有引用时,就需要存在标注

struct  Import<'a> {
    part : & 'a str,
}//这里表示 part的生命周期要和结构体一样长;

生命周期标注省略

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

有的标注编译器可以完成,所以不需要标注;

编译器通过三个方法来判断引用的生命周期,这三个方法的情况下,可以省略生命周期标注

适用于 fn 和 impl

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

静态生命周期

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

相关推荐
醉颜凉4 分钟前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语6 分钟前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
SelectDB8 分钟前
某头部保险公司基于 SelectDB 的统一 OLAP 架构实践
后端
Brilliantwxx32 分钟前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
ServBay34 分钟前
ServBay 1.33.0 来了:AI Gateway 一键接管主流 AI CLI 与多模型
后端·aigc·ai编程
行者全栈架构师35 分钟前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
清水白石00837 分钟前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
JuiceFS38 分钟前
卓驭:百 PB 级智驾数据存储架构演进
后端·自动驾驶
鱼弦40 分钟前
跨模态迁移的极限:语言模型的逻辑能力能否完全迁移到视觉?
后端
kolyle44 分钟前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署