Fre*_*ios 7 generics lifetime rust
在搜索有关保守impl trait的文档时,我发现了这个例子:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
生命周期'a在返回类型中意味着什么?
我知道关于终身受限Box的这个问题,但我认为用例是不同的.如果我理解答案:
特质对象仅对生命周期'a有效
这意味着生活在堆中某处的特征对象将在一生中持续'a.
但在这里,这不是一个特质对象,而是一个生活在堆栈中的具体对象.因此编译器不需要提供有关其生命周期的提示.
我对此缺少什么?
She*_*ter 11
语法impl Iterator<Item = u32> + 'a意味着
impl ...一部分.u32值的迭代器.那是Iterator<Item = u32>一部分.'a.那是+ 'a一部分.在您的示例中,返回的迭代器包含对引用的引用self,因此不能允许它比实例更长寿A,否则它将无效.具体类型(如果我们可以写的话)将是iter::Map<slice::Iter<'a, (u32, u32)>, <closure>>- 注意它有一个'a.
这意味着生活在堆中某处的特征对象将在一生中持续
'a.
这不是真的.两种情况都具有相同的含义:未指定的具体类型可能包含引用.与性状对象,具体类型是某种(的指针背后Box,&,Rc等等).使用impl trait,具体类型直接放在堆栈上.
这不是特征对象,而是生活在堆栈中的具体对象
特征对象不需要堆; 他们只能利用堆栈:
let x: &std::fmt::Display = &42;
println!("{}", x);
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |