You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历Rust int类型HashMap时为什么键需要解引用而值不需要?

问题核心原因

你遇到的类型不匹配问题,本质是构建 HashMap 时键的类型本身就是引用:

  1. HashMap 类型推导逻辑
    你传入的参数v是&Vec<i32>类型,用for x in v迭代得到的x是&i32类型(指向原向量中元素的借用),后续你直接把x作为键插入 HashMap,所以编译器推导出来的 HashMap 实际类型是HashMap<&i32, i32>:键是i32的引用,值是计数用的i32原值。
  2. 遍历匹配时的类型拆解
    当你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:57:01