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中当前键对应的值,核心逻辑如下:- 调用
map.entry(i).or_insert(0)时,如果键i不存在,就会自动插入键值对i:0,然后返回这个新插入的0的可变引用;如果键i已经存在,直接返回已有值的可变引用。 *count +=1是对可变引用进行解引用操作,直接修改HashMap中存储的对应值:每次遍历到对应单词,就把对应计数加1。
- 调用
- 如果删掉
*count +=1语句,你只是调用or_insert(0)完成了不存在的键的初始化,没有对值做任何修改,所以所有键的默认值都是0,最终输出全0的结果。
内容的提问来源于stack exchange,提问作者phuc hung
相关产品推荐
相关产品推荐

