如何模拟Rails.cache.fetch的nil案例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何模拟Rails.cache.fetch的nil案例?相关的知识,希望对你有一定的参考价值。
考虑一下用法
Rails.cache.fetch("key", expires_in: 2.minutes) do
do_something_to_get_value
end
我想用自定义对象模拟
class FakeRedis
def initialize() @data = {} end
def clear() @data = {} end
def write(key, val, *args) @data[key] = val end
def read(key, *args) @data[key] end
def expire(key, *args) @data.delete(key) end
def fetch(key, *args) @data[key] end
end
对于nil
(key
过期或从不存在)的情况,如何重写fetch
以后调用代码块并保存到@data
?
答案
def fetch(key, *args)
return(@data[key]) if @data.kas_key?(key)
@data[key] = yield if block_given?
end
yield
是一个执行块的方法。
另一答案
碰巧ruby Hash有一个很好的fetch
方法几乎相同,除了你必须在块中显式设置键:
class FakeRedis
def fetch(key, *, &block)
if block
@data.fetch(key) { |h, k| h[k] = block.call }
else
@data[key]
end
end
end
另一答案
用这种方式重写:
def fetch(key, *args) @data[key] ||= yield if block_given? end
以上是关于如何模拟Rails.cache.fetch的nil案例?的主要内容,如果未能解决你的问题,请参考以下文章
由于缓存目录将所有权更改为 root,Rails 6 应用程序失败
在 iOS 11 模拟器上运行测试时,视图控制器中的所有 IOutlet 属性均为“nil”
FBRequestConnection startForCustomAudienceThirdPartyID:nil 适用于模拟器,而不适用于设备