为什么我需要两次取消引用HashMap的密钥?

Aur*_*ier 1 hashmap dereference rust

我几天才学习Rust.我认为这两个代码示例是相同的,但编译器不同意.你能解释第二部分会发生什么吗?为什么我需要解除引用key两次,但value一次?

第一部分

use std::collections::HashMap;

let mut h = HashMap::new();   
h.insert(1, 1);
h.insert(2, 2);

let mut keys: Vec<i32> = Vec::new();
let mut values: Vec<i32> = Vec::new();

for (k, v) in &h {
    keys.push(**k);
    values.push(*v);
}
Run Code Online (Sandbox Code Playgroud)

第二部分

fn main() {
    let mut v = vec![2, 3, 5, 1, 2, 3, 8, 6, 3, 1, 4, 6, 7];

    use std::collections::HashMap;

    let mut h = HashMap::new();

    for element in &v {
        let count = h.entry(element).or_insert(0);

        *count += 1;
    }

    let mut keys: Vec<i32> = Vec::new();
    let mut values: Vec<i32> = Vec::new();

    for (k, v) in &h {
        keys.push(**k);
        values.push(*v);
    }

    println!("{:?}", keys);
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*Lee 6

由于您没有指定您的类型HashMap,编译器推断出它.

let v = vec![1i32, 2, 3];
let mut h = HashMap::new();
for i in &v {
    h.insert(i, ());
}
Run Code Online (Sandbox Code Playgroud)

h这里的类型是HashMap<&i32, ()>,类型i&i32.为什么i有这种类型&i32?因为这是如何IntoIterator&Vec实现.通常,当您遍历引用时,您将获得引用.

如果你想要一个HashMap不是参考的密钥类型,你可以这么说.然后,当您尝试插入引用时,您将收到不同的错误消息.

let v = vec![1i32, 2, 3];
let mut h: HashMap<i32, ()> = HashMap::new();
for i in &v {
    h.insert(i, ());
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
 --> src/main.rs:6:18
  |
6 |         h.insert(i, ());
  |                  ^ expected i32, found &i32
  |
  = note: expected type `i32`
             found type `&i32`
Run Code Online (Sandbox Code Playgroud)

然后你可以替换要插入的密钥*i.