Причина ошибки с iter().cloned() по HashMap?


#1

Я тут затупил несколько. Может кто-то разжевать, почему именно такая ошибка сборки выдается?

use std::collections::HashMap;

fn main() {
    type Map = HashMap<u8, u8>;

    let g: Map = Map::new();
    let g1: &Map = &g;

    let z: Map = g1.iter().cloned().collect();

    // ```text
    // error[E0271]: type mismatch resolving `<std::collections::hash_map::Iter<'_, u8, u8> as std::iter::Iterator>::Item == &_`
    //  --> src/main.rs:8:28
    //   |
    // 8 |     let z: Map = g1.iter().cloned().collect();
    //   |                            ^^^^^^ expected tuple, found reference
    //   |
    //   = note: expected type `(&u8, &u8)`
    //              found type `&_`
    // ```

    dbg!(z);
}

Playground


#2

Такое довольно часто встречается, я уже внимание обращать перестал. Стоит зарепортить наверное.
Вот было что-то похожее:


#3

cloned() хочет Self: Iterator<Item = &T>, a HashMap::iter() даёт Iterator<Item = (&K, &V)>.