当搜索有关的文档时保守的隐含特质, 我找到了这个例子 https://github.com/rust-lang/rust/issues/43719:
struct A {
x: [(u32, u32); 10]
}
impl A {
fn iter_values<'a>(&'a self) -> impl 'a + Iterator<Item = u32> {
self.x.iter().map(|a| a.0)
}
}
一生有什么作用'a
意思是返回类型?
我知道这个关于生命周期的问题Box https://stackoverflow.com/questions/42028470/why-is-adding-a-lifetime-to-a-trait-with-the-plus-operator-iteratoritem-foo,但我认为用例是不同的。如果我理解得很好的话,答案是:
Trait 对象仅在生命周期 'a 内有效
这意味着存在于堆中某处的特征对象将持续一生'a
.
但在这里,这不是一个特征对象,而是一个存在于堆栈中的具体对象。所以编译器不需要有关于它的生命周期的提示。
我对此缺少什么?
语法impl Iterator<Item = u32> + 'a
means
- 将返回函数定义的某些类型,但您不知道确切的类型。这就是
impl ...
part.
- 未指定的具体类型将是一个迭代器
u32
价值观。这就是Iterator<Item = u32>
part.
- 未指定的具体类型可能包含参考文献与一生
'a
。这就是+ 'a
part.
在您的示例中,返回的迭代器包含对self
,所以它的生存时间一定不能长于实例的寿命A
,否则无效。具体类型(如果我们可以写的话)是iter::Map<slice::Iter<'a, (u32, u32)>, <closure>>
- 请注意,它有一个'a
in it.
这意味着存在于堆中某处的特征对象将持续一生'a
.
这并不完全正确。两种情况具有相同的含义:未指定的具体类型可能包含引用。对于特征对象,具体类型位于某种类型的指针后面(Box
, &
, Rc
, ETC。)。使用 impl 特性,具体类型直接放置在堆栈上。
这不是一个特征对象,而是一个存在于堆栈中的具体对象
Trait 对象不需要堆;他们只能利用堆栈:
let x: &std::fmt::Display = &42;
println!("{}", x);
也可以看看:
- 为什么 Rust 需要明确的生命周期? https://stackoverflow.com/q/31609137/155423
- 是否允许多态变量? https://stackoverflow.com/q/28219519/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)