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

问题描述 投票:0回答:1

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

  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。

ruby-on-rails ruby redis codeblocks
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.