【发布时间】:2021-03-14 10:53:39
【问题描述】:
我正在尝试使用一个键同时循环两个地图,而不调用 zip()。 我似乎无法让以下代码工作。我做错了什么?
main.rs
use std::collections::HashMap;
mod iteratemaps;
fn main() {
let mut m1 = HashMap::new();
m1.insert(0, 10);
m1.insert(1, 11);
m1.insert(2, 12);
let mut m2 = HashMap::new();
m2.insert(0, 20);
m2.insert(1, 21);
m2.insert(2, 22);
iteratemaps::iterate_maps(&m1, &m2);
}
iteratemaps.rs
use std::collections::HashMap;
pub fn iterate_maps(
m1: &HashMap<u32, i32>,
m2: &HashMap<u32, i32>,
) {
// doesn't work
for i in 0..m1.len() {
println!("{:?}, {:?}", m1.get(&i), m2.get(&i));
}
// works
// for (k, e1) in m1.iter() {
// let mut e2 = m2.get(k);
// println!("{:?}, {:?}", e1, e2)
// }
}
我得到的错误是:
9 | println!("{:?}, {:?}", m1.get(&i), m2.get(&i));
| ^^ expected `u32`, found `usize
【问题讨论】:
-
好吧,
m1.len()返回一个usize,而您的密钥是u32。一个需要明确地转换为另一个。也就是说,如果你的键总是像这样连续,那么 Vec 理论上不会比 HashMap 更好吗? -
是的,我知道我需要转换为 u32,我似乎没有正确理解语法。那会怎么样?是的,一个 Vec 是有意义的,但这是一个最小的例子。我这里需要一个 HashMap。
-
i as u32应该可以工作。请注意,如果i大于u32可以容纳的大小,这种原始类型转换会静默溢出。 -
你不能使用
zip的原因是什么? -
因为我想用同一个key依次遍历两张map。我想做一个结果[i] = m1[i] * m2[i]。也许我做错了什么,但无法使用 zip 从 m1 和 m2 地图中获取相同的索引。
标签: rust