HashMap::IntoIter
, связанный тип из трейта IntoIterator
, не имеет параметров типа. HashMap
делает : HashMap::<Rc<K>, V>::IntoIter
. Это неоднозначно, поэтому вы должны полностью определить его:
type IntoIter = <std::collections::HashMap::<Rc<K>, V> as IntoIterator>::IntoIter;
Обычно это выражается как
type IntoIter = std::collections::hash_map::IntoIter<Rc<K>, V>;
Затем вы сталкиваетесь с проблемой, которую пытаетесь решить ie. компилятор, поскольку не возвращает этот тип :
error[E0308]: mismatched types
--> src/lib.rs:21:9
|
21 | / self.values
22 | | .into_iter()
23 | | .map(|(key, valueCounter)| (key, valueCounter.value))
| |_________________________________________________________________^ expected struct `std::collections::hash_map::IntoIter`, found struct `std::iter::Map`
|
= note: expected struct `std::collections::hash_map::IntoIter<_, V>`
found struct `std::iter::Map<std::collections::hash_map::IntoIter<_, ValueCounter<V>>, [closure@src/lib.rs:23:18: 23:65]>`
Следуя подсказкам из связанных вопросов, вы получите
use std::{collections::hash_map::IntoIter, iter::Map};
impl<K: Hash + Eq, V> IntoIterator for LFUCache<K, V> {
type Item = (Rc<K>, V);
type IntoIter =
Map<IntoIter<Rc<K>, ValueCounter<V>>, fn((Rc<K>, ValueCounter<V>)) -> (Rc<K>, V)>;
fn into_iter(self) -> Self::IntoIter {
fn xform<K, V>((key, vc): (Rc<K>, ValueCounter<V>)) -> (Rc<K>, V) {
(key, vc.value)
}
self.values.into_iter().map(xform)
}
}
См. также :