【问题标题】:Why does using "return" in Rails.cache.fetch block fail to cache?为什么在 Rails.cache.fetch 块中使用“return”无法缓存?
【发布时间】:2018-01-09 21:57:11
【问题描述】:

为什么在 Rails.cache.fetch 中使用 return 会导致缓存未命中?

# doesn't catch
Rails.cache.fetch("key", expires_in: 12.hours) do
 puts "CACHE MISS" 
 return "HI"
end

# caches
Rails.cache.fetch("key", expires_in: 12.hours) do 
 puts "CACHE MISS"
 "HI"
end

【问题讨论】:

  • 因为它不是 C# 兄弟 :) 简而言之:return 立即从 fetch 方法退出,而不处理(缓存)块产生结果。谷歌ruby block return 了解详情。

标签: ruby-on-rails caching


【解决方案1】:

要对此进行解释,我们首先需要了解 yield 的工作原理:

  • yield 关键字允许在方法调用期间传递一组附加指令。这意味着,一个方法可以接受一个块(除了常规参数)并使用 yield 关键字从方法内部执行该块。

  • 还有一点我们需要知道的是,在执行一个yield块时,如果在其中调用return,它会返回整个方法而不仅仅是块。

  • 查看yieldhere的更多信息。

Rails.cache.fetch 方法是通过接受一个块并使用yield 关键字执行它来实现的(带有一些额外的逻辑)。 因此,当从发送到Rails.cache.fetch的块内部返回时,整个方法在没有首先处理(缓存)产生结果的块的情况下返回,并且缓存失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多