Я пытаюсь преобразовать вектор пар &str в HashMap со следующим фрагментом кода:
use std::collections::HashMap;
fn main() {
let pairs = vec!(("foo", "bar"), ("toto", "tata"));
let map: HashMap<&str, &str> = pairs.iter().collect();
println!("{:?}", map);
}
Однако компиляция не выполняется с этой ошибкой:
<anon>:5:47: 5:56 error: the trait `core::iter::FromIterator<&(&str, &str)>` is not implemented for the type `std::collections::hash::map::HashMap<&str, &str>` [E0277]
<anon>:5 let map: HashMap<&str, &str> = pairs.iter().collect();
Однако, если я добавляю .cloned() перед вызовом collect(), все работает нормально:
...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
Даже если я понимаю сообщение об ошибке (нет реализации признака FromIterator<&(&str, &str)> для типа HashMap<&str, &str>), я не понимаю, откуда приходит тип &(&str, &str) (согласно сигнатуре метода в документации Rust ) и почему вызов cloned() устраняет эту проблему.