我设法编写并编译了这段代码:
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
&#39 ;生命周期'a
需要小于或等于'a
?借用self
的生命周期是什么?
答案 0 :(得分: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
有效期为'a
,那么Player
值的生命周期严重属于'a
。
让名称为'b
Player
这样的值生命周期,然后:'b < 'a
避免lifetime elision我们可能会将as_ref
重写为:
fn as_ref<'b>(&'b self) -> &'b T {
self.t
}
借用self
和返回&T
的有效期是严格的'a
。