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
- 应用于输入生命周期;(函数的传参)
每个引用类型的参数都有自己的生命周期 - 应用于输出生命周期 (函数的返回值)
如果只有一个输入生命周期参数,那么该生命周期都将赋给所有的输出生命周期参数 - 应用于输出生命周期 (函数的返回值)
如果有多个输入参数生命周期参数,但其中一个是 &self 或 & mut self ;那么self 的生命周期将赋给所有的输出生命周期参数
静态生命周期
'static 是一个特殊的生命周期,表示的是 整个程序的持续时间。