【发布时间】:2014-10-31 09:54:04
【问题描述】:
我遇到了一个简化为以下内容的问题:
struct MyIter {
vec: Vec<i8>,
}
fn fill_with_useful_data(v: &mut Vec<i8>) {
/* ... */
}
impl<'a> Iterator for MyIter {
type Item = &'a [i8];
fn next(&mut self) -> Option<&'a [i8]> {
fill_with_useful_data(&mut self.vec);
Some(&self.vec)
}
}
fn main() {
for slice in (MyIter { vec: Vec::new() }) {
println!("{}", slice);
}
}
这会产生错误:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:9:6
|
9 | impl<'a> Iterator for MyIter {
| ^^ unconstrained lifetime parameter
这个想法是,迭代器做了一堆反映在其字段中的工作,并且在每一步,它都会产生对调用代码的自身引用。在这种情况下,我可以将其建模为生成状态副本而不是引用,但让我们假设这是不可能的,或者只是代价高昂。
直觉上这应该不是问题,因为借用检查器可以确保不会再次调用.next(),而产生的引用仍可用于检查迭代器的状态,但Iterator trait 似乎没有直接提供这种东西。即使有一些排列,比如只在迭代器本身中保留对向量的引用,或者使迭代器成为引用或其他东西,以便更早地将生命周期烘焙到类型中,我无法通过借用检查器获得任何东西。
我阅读了“Iterators yielding mutable references”博文,但我不确定它是否/如何适用于我的不涉及可变引用的问题。
【问题讨论】:
标签: rust