我有这行代码,它完全按照我的要求执行。但我不知道它为什么会起作用。
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行)