遍历Rust int类型HashMap时为什么键需要解引用而值不需要?
问题核心原因
你遇到的类型不匹配问题,本质是构建 HashMap 时键的类型本身就是引用:
- HashMap 类型推导逻辑
你传入的参数v是&Vec<i32>类型,用for x in v迭代得到的x是&i32类型(指向原向量中元素的借用),后续你直接把x作为键插入 HashMap,所以编译器推导出来的 HashMap 实际类型是HashMap<&i32, i32>:键是i32的引用,值是计数用的i32原值。 - 遍历匹配时的类型拆解
当你用for (&k, &v) in &h迭代不可变借用的 HashMap 时,迭代器产出的每一项类型是(&K, &V),代入上面的 HashMap 类型,最终项的类型是(&&i32, &i32):
- 对值的位置做
&v模式匹配:匹配的是&i32类型,匹配后v直接绑定为底层的i32原值,所以可以直接使用不需要解引用。 - 对键的位置做
&k模式匹配:匹配的是&&i32类型,去掉一层引用后,k绑定的仍然是&i32类型,你要赋值给类型为Option<i32>的last_key,自然需要多一层解引用*k才能拿到i32原值。
优化方案
如果不想额外解引用,可以在插入 HashMap 时就把键存为i32原值,仅需修改插入逻辑:
// 把x解引用后作为键插入,此时HashMap类型推导为HashMap<i32, i32> let counter = h.entry(*x).or_insert(0);
修改后遍历的时候&k匹配到的就是i32原值,不需要额外解引用。
内容的提问来源于stack exchange,提问作者peroksid
相关产品推荐
相关产品推荐

