rust - 价值的生命周期与借款的生命周期
问题描述
我设法编写并编译了这段代码:
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
多少?
解决方案
如果编译器可以确保T
作为引用的结构的字段超过T
.
有了这样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
为了避免生命周期省略,我们可以重写as_ref
为:
fn as_ref<'b>(&'b self) -> &'b T {
self.t
}
借入self
和归还&T
的生命周期是严格次要的生命周期'a
。
推荐阅读
- ios - 如何从 HealthKit 中获取与 Health App 的值相同的静息能量值?
- python - 尝试更改 RTSP 视频流的分辨率
- sql - 表中具有 NULL 值的第一列
- javascript - 如何在.on jquery中锁定/设置/阻止变量
- django - Django rest 模型 m2m 顺序存储
- javascript - InvalidSelectorError:无效选择器:无法使用 xpath 表达式定位元素
- html - CSS图像重新对齐,不同的液晶屏/屏幕
- c++ - 与 alphachannel 的图像重叠在 QT 上不起作用
- c# - 不同的 Json 数据 c#
- typescript - 如何在“noImplicitAny”检查活动的情况下重写循环中的打字稿?