【发布时间】:2015-11-28 01:37:18
【问题描述】:
我正在尝试使用以下代码 sn-p 将 &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();
但是,如果我在调用 collect() 之前添加 .cloned() 一切正常:
...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
即使我理解错误消息(HashMap<&str, &str> 类型没有特征 FromIterator<&(&str, &str)> 的实现)我也不明白 &(&str, &str) 类型来自哪里(根据 Rust 文档中的方法签名) 以及为什么调用 cloned() 可以解决这个问题。
【问题讨论】: