如何在同一个结构中存储HashMap及其值迭代器?

时间:2015-08-13 12:40:23

标签: iterator rust

我正在处理在内部使用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);
    }
}

非常感谢任何建议。

0 个答案:

没有答案