Я пытаюсь преобразовать вектор пар &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()
устраняет эту проблему.