如何模拟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

对于nilkey过期或从不存在)的情况,如何重写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案例?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 使用 fetch 进行缓存

由于缓存目录将所有权更改为 root,Rails 6 应用程序失败

缓存的 Ruby Haml 块返回空

Ralis 模块和调用静态方法

在 iOS 11 模拟器上运行测试时,视图控制器中的所有 IOutlet 属性均为“nil”

FBRequestConnection startForCustomAudienceThirdPartyID:nil 适用于模拟器,而不适用于设备