< 返回版块

oatall 发表于 2020-06-19 17:22

没有问题

    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为什么不能这样插入,正确的插入方式是什么啊?

评论区

写评论
Ryan-Git 2020-06-19 20:16

类型问题前两楼说的很清楚了,补充一点原理。

b_map 里的元素是对前两个 map 的引用,他不拷贝元素本身。如果学过 c/c++,里面的东西就类似指针/引用,省了字符串拷贝。

作者 oatall 2020-06-19 19:30

试过直接加引用,后面用b_map的话不行。

error[E0716]: temporary value dropped while borrowed
  --> src\main.rs:12:19
   |
12 |     b_map.insert(&"D".to_string(), &99);
   |                   ^^^^^^^^^^^^^^^      - temporary value is freed at the end of this statement
   |                   |
   |                   creates a temporary which is freed while still in use
13 |     println!("Hello, world!{:?}",b_map);
   |                                  ----- borrow later used here
   |
   = note: consider using a `let` binding to create a longer lived value

对以下内容的回复:

作者 oatall 2020-06-19 19:11

懂了,感谢大佬们指点。

xjkdev 2020-06-19 18:20
    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);

teams.iter()中迭代器的元素类型为&String,而teams_scores.iter()中迭代器的元素类型为&i32。

所以b_map的类型为HashMap<&String,&i32>,与第一个例子中的类型就不一样了。

建议这么修改:

    let mut b_map:HashMap<_, _> = teams.iter().cloned().zip(teams_scores.iter().cloned()).collect();
whfuyn 2020-06-19 18:06

报错提示了,help: consider borrowing here: &99``,加个引用就行。

原因是iter迭代的是&T,collect起来的那个HashMap的key和value的类型也就变成&T,用into_iter的话迭代的是T,就没有这个问题。

liangyongrui 2020-06-19 17:44
    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.into_iter().zip(teams_scores.into_iter()).collect();
    b_map.insert("D".to_string(), 99);
1 共 6 条评论, 1 页