在下面的Rust代码中,我正在计算一个int型向量的模式。看第38行和42行,我必须在这里取消对k的引用。如果我这样做,它编译并运行正常。如果我没有-我得到错误&;expected i32, found &;i32&;(参见代码片段后面)。为什么对value的引用(就像我在第34行中对&v的引用)给了我值,但对键的引用又给了我另一个引用,我必须对它解引用才能得到真正的键?
use std::collections::HashMap;
fn mode(v: &Vec<i32>) -> i32 {
let mut h = HashMap::new();
for x in v {
let counter = h.entry(x).or_insert(0);
*counter += 1;
}
let mut last_key: Option<i32> = None;
let mut last_value: Option<i32> = None;
for (&k, &v) in &h {
println!("k, v: {}, {}", k, v);
match last_value {
Some(x) => {
if x > v {
last_key = Some(*k);
last_value = Some(v)
}
}
None => {
last_key = Some(*k);
last_value = Some(v)
}
}
}
if let Some(x) = last_key {
x
} else {
panic!("empty list");
}
}
Playgorund
error[E0308]: mismatched types --> src/main.rs:38:33
| 38 | last_key = Some(k);
| ^
| |
| expected `i32`, found `&i32`
| help: consider dereferencing the borrow: `*k`
因为当你遍历&Vec时,x的值是&i32,所以hashmap的键是&i32,值是i32
for (&k, &v) in &h
当你跨过&h时,键值对是(&&i32, &i32)但是你用&匹配键值,所以这里k是&i32, v是i32,所以你必须在这里对k进行解引用