为什么此代码块在Rails.cache.fetch之后执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么此代码块在Rails.cache.fetch之后执行相关的知识,希望对你有一定的参考价值。

我有这行代码,它完全按照我的要求执行。但我不知道它为什么会起作用。

  Rails.cache.fetch(key, expires_in: 1.day) do
    a << b
  end

它应该做的是如果Rails缓存中不存在密钥,则将b添加到a。

为什么我很困惑?

      Rails.cache.fetch(key, expires_in: 1.day)

无论密钥是否已经在缓存中,都返回nil。

问题:为什么代码块在缓存中没有密钥时运行,否则不运行?

额外的细节:Rails缓存连接到Redis。

答案

尽管do ... end返回Rails.cache.fetch,但nil块被评估可能会令人困惑。但do ... end区块并没有在nil响应之上运行。

事实上,do ... end块是fetch方法调用的另一个参数。看看source code of fetch

没有一个块fetch基本上只做一件事 - 在第328行调用read(name, options)但是有一个块更多(第307到324行)

以上是关于为什么此代码块在Rails.cache.fetch之后执行的主要内容,如果未能解决你的问题,请参考以下文章

Rails 使用 fetch 进行缓存

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

缓存的 Ruby Haml 块返回空

ffmpeg.c pts 和 dts 是啥?这个代码块在 ffmpeg.c 中做了啥?

Ralis 模块和调用静态方法

如何使用 Ruby 块在厨师食谱中分配变量