我正在处理在内部使用HashMap的迭代器适配器。首先,它将所有输入迭代器键与映射匹配,并将它们标记为匹配。最后,我想迭代地图上标记为不匹配的值。
显然,我需要将map及其Values迭代器(存储迭代的状态)存储在同一个struct中,但我无法弄清楚如何去做。
这是一个没有匹配输入迭代器的例子,以保持简单:
use std::collections::hash_map::{HashMap, Values,};
use std::hash::Hash;
struct Foo<'a, K, V>
where K: 'a + Hash + Eq,
V: 'a + Clone,
{
map: HashMap<K, (V, bool)>,
values: Values<'a, K, (V, bool)>,
}
impl<'a, K, V> Foo<'a, K, V>
where K: 'a + Hash + Eq,
V: 'a + Clone,
{
fn new<I>(it: I) -> Self
where I: Iterator<Item=(K, V)>
{
// load the HashMap
let mut map: HashMap<K, (V, bool)> = HashMap::new();
for (k, v) in it {
map.insert(k, (v, false));
}
// I cannot use `let values = map.values();` since map will be moved to Foo.
Foo {map: map, values: ???}
}
}
impl<'a, K, V> Iterator for Foo<'a, K, V>
where K: 'a + Hash + Eq,
V: 'a + Clone,
{
type Item = V;
fn next(&mut self) -> Option<Self::Item> {
match self.values.next() {
loop {
match some.values.next() {
Some(v) if !v.1 => return Some(Clone::clone(&v.0)),
Some(_) => continue,
None => return None,
}
}
}
}
}
fn main() {
let it = (0..).zip("AB".chars());
let foo = Foo::new(it);
for v in foo {
println!("{}", v);
}
}
非常感谢任何建议。