首页 > 解决方案 > 价值的生命周期与借款的生命周期

问题描述

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

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是一些实现 trait 的具体类型,Runner并且T' 的生命周期很'a长。t是借款T,借款也'a很长。

这种理解正确吗?

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

标签: rustlifetimeborrow-checker

解决方案


如果编译器可以确保T作为引用的结构的字段超过T.

有了这样Player的定义:

struct Player<'a, T>
where
    T: Runner + 'a,
{
    t: &'a T,
}
  1. 我们'at.

  2. 随着T: Runner + 'a我们声明T实现Runner并且所有(最终)引用T必须超过'a

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

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

为了避免生命周期省略,我们可以重写as_ref为:

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

借入self和归还&T的生命周期是严格次要的生命周期'a


推荐阅读