【发布时间】:2018-10-25 09:16:31
【问题描述】:
在搜索有关 conservative impl trait 的文档时,I found this example:
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 的生命周期是什么意思?
我知道this question about lifetime bound in Box,但我认为用例不同。如果我很好理解答案:
trait 对象只在生命周期内有效 'a
这意味着存在于堆中某处的 trait 对象将持续一生'a。
但是在这里,这不是一个特征对象,而是一个存在于堆栈中的具体对象。所以编译器不需要提示它的生命周期。
我错过了什么?
【问题讨论】:
-
这意味着几乎与您在任何范围内看到一生时的含义相同。例如
T: 'a + Debug. -
@PeterHall 如果我理解这个表示法,当我们在某处使用对
T的引用时需要它。但在这里,我返回一个具体的struct,它实现了Iterator。 -
借用检查器使用人类读者也无法访问的任何信息来推理代码是不公平的。虽然具体类型在函数内部是已知的,但在外部是未知的。