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

Why does this codeblock execute after 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)

returns 无,无论密钥是否已在缓存中。

问题: 为什么当缓存中没有密钥时代码会阻塞 运行,而在其他情况下不会 运行?

额外详细信息:Rails 缓存已连接到 Redis。

尽管 Rails.cache.fetch returns nildo ... end 块进行求值可能会造成混淆。但是 do ... end 块不会 运行 在 nil 响应之上。

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

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