[易学易懂系列|rustlang语言|零基础|快速入门|(5)|生命周期Lifetime]

时间:2021-04-06 20:00:12

[易学易懂系列|rustlang语言|零基础|快速入门|(5)]

Lifetimes

我们继续谈谈生命周期(lifttime),我们还是拿代码来说话:


fn main() {
let mut a = vec![1, 2, 3];
let b = &mut a; // &mut borrow of `a` starts here
// some code println!("{:?}", a); // trying to access `a` as a shared borrow, so giving an error
} // &mut borrow of `a` ends here

我们在上篇文章说到,这段代码:


println!("{:?}", a);

是过不了霸道的编译器女王的检查的?

为什么?

因为b借用了a的数据所有权,没有还回来。

所以,这时,访问a的数据时,编译器女王报错。

那要怎么办?加大括号 {}。

如下 :


fn main() {
let mut a = vec![1, 2, 3];
{
let b = &mut a; // &mut borrow of `a` starts here
// any other code
} // &mut borrow of `a` ends here println!("{:?}", a); // allow borrowing `a` as a shared borrow
}

我们可以看到,b 的“生命周期”,是限定在大括号 {}中的。

我们来看一个更清楚的代码:


[易学易懂系列|rustlang语言|零基础|快速入门|(5)|生命周期Lifetime]


我们现在知道,可以用大括号来限定变量或引用的生命周期。但太多大括号,会让你看得头大。

[易学易懂系列|rustlang语言|零基础|快速入门|(5)|生命周期Lifetime]

没关系,rust都为你考虑到了。下面是生命周期定义的标准写法。

翠花,上代码 :



// No inputs, return a reference
fn function<'a>() -> &'a str {} // Single input
fn function<'a>(x: &'a str) {} // Single input and output, both have the same lifetime
// The output should live at least as long as input exists
fn function<'a>(x: &'a str) -> &'a str {} // Multiple inputs, only one input and the output share same lifetime
// The output should live at least as long as y exists
fn function<'a>(x: i32, y: &'a str) -> &'a str {} // Multiple inputs, both inputs and the output share same lifetime
// The output should live at least as long as x and y exist
fn function<'a>(x: &'a str, y: &'a str) -> &'a str {} // Multiple inputs, inputs can have different lifetimes