T 形式的生命周期界限:'a

Har*_*ork 7 lifetime rust

我试图理解什么T: 'a意思,我想,它T是一种类型,'a是一生。

我理解什么'a: 'b意思:( ) 比 ( ) 寿命长x,所以我们不能在下面的代码中分配给'ay'byx

fn foo<'a, 'b, T>(mut x: &'a T, mut y: &'b T) 
   where 'a: 'b {
  x = y; //compile time error
}
Run Code Online (Sandbox Code Playgroud)

这本参考书上写到

T: 'a意味着所有生命周期参数都T失效了'a

但我对“所有生命周期参数T”感到困惑。什么是“ (类型?)T 的生命周期参数”?我知道,这个签名'a就是一生。意思是一样的吗?xfn foo<'a, T>(x: &'a T)

T:'a有人可以通过举例解释什么意思吗?我什至无法想象我们可以在哪里使用它以及为什么。

Apl*_*123 4

虽然引用可以有生命周期,但类型也可以有生命周期。最简单的例子可能是:

struct Foo<'a> {
    x: &'a i32
}
Run Code Online (Sandbox Code Playgroud)

如果您构造一个类型的结构体Foo(我们称之为实例foo),并引用本地堆栈上的an i32(我们称之为 this ),那么无论其自身的范围如何,其生存时间都不能超过 的范围。这是一个没有引用的生命周期(至少没有引用类型)。numfoonumfoo

让我们看一个现实世界的例子Box::leak::

pub fn leak<'a>(b: Box<T>) -> &'a mut T
where
    T: 'a,
Run Code Online (Sandbox Code Playgroud)

类型签名基本上表示,给定一个框,您可以在任何生命周期内创建对其值的引用,只要该值本身能够持续该生命周期即可。因此,我们可以创建一个&'static i32with Box::leak,因为i32没有任何东西限制它的生命周期,但是我们不能创建一个&'static Foo引用堆栈整数的 a ,因为它有一个限制其生命周期的引用。

请注意,如果您在本地进行测试,由于右值静态提升&5,类似的事情实际上会创建一个,因此您可能需要将其更改为不可提升的类型,例如。&'static i32i32String