价值的生命周期与借款的生命周期

时间:2018-06-08 13:15:49

标签: rust lifetime borrow-checker

我设法编写并编译了这段代码:

trait Runner {}

struct Human {}

impl Runner for Human {}

struct Player<'a, T>
where
    T: Runner + 'a,
{
    t: &'a T,
}

impl<'a, T> AsRef<T> for Player<'a, T>
where
    T: Runner + 'a,
{
    fn as_ref(&self) -> &T {
        self.t
    }
}

fn main() {}

我的理解是,在struct Player的定义中,T是实现特征RunnerT生命周期的具体类型。 'a多久。 t正在借用T,借款也是'a长。

这种理解是否正确?

impl AsRef for Player的定义中,编译器如何知道返回借用的生命周期T(来自as_refT&#39 ;生命周期'a需要小于或等于'a?借用self的生命周期是什么?

1 个答案:

答案 0 :(得分:2)

如果编译器可以确保结构T的字段比T的生命周期更长,那么

Rust可以成功构建。

使用Player定义:

struct Player<'a, T>
where
    T: Runner + 'a,
{
    t: &'a T,
}
  1. 我们在'a的生命周期t命名。

  2. 使用T: Runner + 'a,我们声明T实施Runner并且T中的所有(最终)引用必须超过'a

  3. 如果上述考虑因素t有效期为'a,那么Player值的生命周期严重属于'a

    让名称为'b Player这样的值生命周期,然后:'b < 'a

    避免lifetime elision我们可能会将as_ref重写为:

    fn as_ref<'b>(&'b self) -> &'b T {
        self.t
    }
    

    借用self和返回&T的有效期是严格的'a