我遇到了一个问题,可以简化为以下几点:
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
特性似乎没有直接提供此类功能.即使有一些排列,比如只保留迭代器本身中对向量的引用,或者使迭代器成为引用,或者让生命周期更早地烘焙到类型中,我也无法通过borrow 判断器.
我读了"Iterators yielding mutable references"博客,但我不确定它是否适用于我的问题,不涉及可变引用.