从概念上讲,我想要一个"扩展的"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()
}
}
抱怨是因为K
和V
需要终身限制,所以我尝试了
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
实现的生存期。