gpt4 book ai didi

hashmap - 为什么我需要取消引用 HashMap 的键两次?

转载 作者:行者123 更新时间:2023-11-29 08:10:05 27 4
gpt4 key购买 nike

我才学习 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);
}

第二部分

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);
}

最佳答案

因为您没有指定 HashMap 的类型,编译器推断出它。

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

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, ());
}
error[E0308]: mismatched types
--> src/main.rs:6:18
|
6 | h.insert(i, ());
| ^ expected i32, found &i32
|
= note: expected type `i32`
found type `&i32`

然后您可以将要插入的 key 替换为*i .

关于hashmap - 为什么我需要取消引用 HashMap 的键两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45635783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com