考虑一下用法
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