价值的生命周期与借用的生命周期
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,
}
我们用 '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
。
我设法编写并编译了这段代码:
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,
}
我们用
'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
。