我设法编写并编译了这段代码:
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
?借用 self
的生命周期是多少?
1 回答
如果编译器可以确保结构
T
的字段比T
的生命周期更长,则Rust可以成功构建 .有了这样的
Player
定义:我们用
'a
命名t
的生命周期 .使用
T: Runner + 'a
,我们声明T
实现Runner
并且T
中的所有(最终)引用必须超过'a
对于上述考虑,如果
t
lifetime是'a
,那么Player
值的生命周期严格来说是'a
的次要 .让名称
'b
这样的Player
值生命,然后:'b < 'a
避免lifetime elision我们可能会重写
as_ref
:借用
self
和返回的&T
的生命周期是严格的'a
的一生 .