Rust基于HashMap实现Cacher时缓存不生效问题排查
问题原因分析
你实现的value方法问题出在HashMap的or_insert方法的求值逻辑上:
- Rust默认采用严格求值策略,所有传入函数的参数都会在函数执行前完成计算
- 你调用
or_insert((self.calculation)(arg))时,不管当前arg对应的键是否已经存在于缓存中,(self.calculation)(arg)这部分计算逻辑都会先执行一遍,再把结果传给or_insert。这就是哪怕传入重复参数,也会触发计算逻辑执行的核心原因。
修复方案
把or_insert替换为or_insert_with方法即可,后者接收一个无参闭包,只有当对应键不存在、需要插入默认值的时候,才会执行闭包得到要插入的值,完全避免多余计算。
修改后的value方法代码如下:
pub fn value(&mut self, arg: U) -> &U{ self.values.entry(arg).or_insert_with(|| (self.calculation)(arg)) }
修改后重新运行测试代码,只会输出3次执行日志,分别对应参数1、2、3的首次调用,重复调用相同参数不会再触发计算逻辑,符合缓存的预期效果。
内容的提问来源于stack exchange,提问作者Felix B.
相关产品推荐
相关产品推荐

