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

Rust HashMap entry/or_insert使用及打印、计数逻辑问题咨询

问题解答

问题1:代码1的scores无法正常打印、代码2的map可正常打印的原因

这是Rust借用检查规则的强制限制:

  • 代码1中,or_insert()方法返回的是HashMap中对应值的可变借用(类型为&mut i32),赋值给x后,只要x还在作用域内,scores就持有一个活跃的可变借用。此时调用println!("{:?}",scores)需要对scores进行不可变借用,违反了Rust「同一时间同一资源不能同时存在活跃的可变借用和不可变借用」的规则,会直接触发编译报错。
  • 代码2中,count可变借用是在for循环的每次迭代内部声明的,每次迭代结束后count就会离开作用域,可变借用自动释放。循环结束后打印map时,没有任何活跃的借用占用map,因此可以正常打印。

补充验证:如果把代码1的打印顺序调换,先打印x再打印scores,就可以正常运行,因为打印完x后它的生命周期结束,可变借用已经释放。

问题2:count变量的作用和相关逻辑解释

  • count本质是or_insert()返回的可变引用,指向HashMap中当前键对应的值,核心逻辑如下:
    1. 调用map.entry(i).or_insert(0)时,如果键i不存在,就会自动插入键值对i:0,然后返回这个新插入的0的可变引用;如果键i已经存在,直接返回已有值的可变引用。
    2. *count +=1是对可变引用进行解引用操作,直接修改HashMap中存储的对应值:每次遍历到对应单词,就把对应计数加1。
  • 如果删掉*count +=1语句,你只是调用or_insert(0)完成了不存在的键的初始化,没有对值做任何修改,所以所有键的默认值都是0,最终输出全0的结果。

内容的提问来源于stack exchange,提问作者phuc hung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:02