首页 文章

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

提问于
浏览
0

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

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 的生命周期是 'a 需要小于或等于 'a ?借用 self 的生命周期是多少?

1 回答

  • 2

    如果编译器可以确保结构 T 的字段比 T 的生命周期更长,则Rust可以成功构建 .

    有了这样的 Player 定义:

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

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

    对于上述考虑,如果 t lifetime是 'a ,那么 Player 值的生命周期严格来说是 'a 的次要 .

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

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

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

    借用 self 和返回的 &T 的生命周期是严格的 'a 的一生 .

相关问题