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

Lifetime of a value vs lifetime of a borrow

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

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是实现特征Runner的具体类型,T的生命周期是'a 长。 t 正在借入 T 并且借出的也是 'a 多头。

这个理解对吗?

impl AsRef for Player的定义中,编译器如何知道返回借用到T(来自as_ref)的生命周期,其中T的生命周期是'a 需要小于或等于 'a? borrow to self 的生命周期是多少?

如果编译器可以确保作为引用的结构 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

出于上述考虑,如果 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