我将尝试创建一个可变的迭代器,用于类型为:Vec<Vec<(K, V)>>
的向量
迭代器代码:
pub struct IterMut<'a, K: 'a, V: 'a> {
iter: &'a mut Vec<Vec<(K, V)>>,
ix: usize,
inner_ix: usize,
}
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
while self.iter.len() < self.ix {
while self.iter[self.ix].len() < self.inner_ix {
self.inner_ix += 1;
let (ref k, ref mut v) = self.iter[self.ix][self.inner_ix];
return Some((&k, &mut v));
}
self.ix += 1;
}
return None;
}
}
我遇到的错误是:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/main.rs:16:42
|
16 | let (ref k, ref mut v) = self.iter[self.ix][self.inner_ix];
| ^^^^^^^^^^^^^^^^^^
|
help: consider using an explicit lifetime parameter as shown: fn next(&'a mut self) -> Option<(&'a K, &'a mut V)>
--> src/main.rs:11:5
|
11 | fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
| ^
显然我有终身难题,但我不知道如何告诉编译器这应该可以工作。
这样实现可变迭代器是否正确,还是有更好的方法?
unwrap_or_else(...)
是用于当outer
为空时的情况吗? - Jesper Axelsson'static
,但是无法让代码正常工作... 我漏掉了&mut []
周围的额外括号 :( 感谢您的编辑,现在看起来更加简洁! - Matthieu M.