在 rust 中传递一个地图迭代器



从概念上讲,我想要一个"扩展的"HashMap类,我称之为频率表

#[derive(Clone)]
pub struct FrequencyTable<K,V>(HashMap<K,HashSet<V>>);

我想定义一个超过HashMap成员的"默认值"。

我的第一次尝试是

impl<K,V> std::iter::IntoIterator for FrequencyTable<K,V> {
type Item = (K,HashSet<V>);
type IntoIter = std::collections::hash_map::Iter<'static, K, HashSet<V>>;
fn into_iter(self) -> std::collections::hash_map::Iter<'static, K, HashSet<V>> {
self.0.iter()
}
}

抱怨是因为KV需要终身限制,所以我尝试了

impl<K,V> std::iter::IntoIterator for FrequencyTable<K,V> where K: 'static, V:'static {
type Item = (K,HashSet<V>);
type IntoIter = std::collections::hash_map::Iter<'static, K, HashSet<V>>;
fn into_iter(self) -> std::collections::hash_map::Iter<'static, K, HashSet<V>> {
self.0.iter()
}
}

然后说expected parameter 'k', found '&K' ...但是将&s 添加到变量中并不能解决错误。

你需要使用IntoIterator::into_iter不是从内部来源Iter::iter

use std::collections::HashSet;
use std::collections::HashMap;
#[derive(Clone)]
pub struct FrequencyTable<K,V>(HashMap<K,HashSet<V>>);
impl<K,V> std::iter::IntoIterator for FrequencyTable<K,V> {
type Item = (K,HashSet<V>);
type IntoIter = std::collections::hash_map::IntoIter<K, HashSet<V>>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}

操场

请注意,Iter产生&T并获取&self,而IntoIter产生T并获取self。因此,您无需处理此IntoIter实现的生存期。

相关内容

  • 没有找到相关文章

最新更新