没有问题
let mut a_map = HashMap::new();
a_map.insert("A".to_string(), 1);
a_map.insert("B".to_string(), 3);
a_map.insert("C".to_string(), 2);
a_map.insert("D".to_string(), 99);
有问题
let teams = vec!["A".to_string(),"B".to_string(), "C".to_string()];
let teams_scores = vec![1, 3, 2];
let mut b_map:HashMap<_, _> = teams.iter().zip(teams_scores.iter()).collect();
b_map.insert("D".to_string(), 99);
报错
error[E0308]: mismatched types
--> src\main.rs:12:18
|
12 | b_map.insert("D".to_string(), 99);
| ^^^^^^^^^^^^^^^
| |
| expected `&std::string::String`, found struct `std::string::String`
| help: consider borrowing here: `&"D".to_string()`
error[E0308]: mismatched types
--> src\main.rs:12:35
|
12 | b_map.insert("D".to_string(), 99);
| ^^
| |
| expected `&{integer}`, found integer
| help: consider borrowing here: `&99`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.
error: could not compile `hashmap`.
To learn more, run the command again with --verbose.
第二种方法构建的HashMap为什么不能这样插入,正确的插入方式是什么啊?
1
共 6 条评论, 1 页
评论区
写评论类型问题前两楼说的很清楚了,补充一点原理。
b_map 里的元素是对前两个 map 的引用,他不拷贝元素本身。如果学过 c/c++,里面的东西就类似指针/引用,省了字符串拷贝。
试过直接加引用,后面用b_map的话不行。
对以下内容的回复:
懂了,感谢大佬们指点。
teams.iter()中迭代器的元素类型为&String,而teams_scores.iter()中迭代器的元素类型为&i32。
所以b_map的类型为HashMap<&String,&i32>,与第一个例子中的类型就不一样了。
建议这么修改:
报错提示了,
help: consider borrowing here:
&99``,加个引用就行。原因是iter迭代的是&T,collect起来的那个HashMap的key和value的类型也就变成&T,用into_iter的话迭代的是T,就没有这个问题。