ActiveSupport :: Memoizable引用哪个Ruby memoize模式?

所以在Rails 3.2中,ActiveSupport :: Memoizable已经被弃用了。

该消息显示:

DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and will be removed in future releases,simply use Ruby memoization pattern instead. 

它指的是“Ruby的memoization模式”(单数)好像有一个模式,我们应该都知道和参考…

我认为他们的意思是这样的:

 def my_method @my_method ||= # ... go get the value end 

要么

 def my_method return @my_method if defined?(@my_method) @my_method = # ... go get the value end 

还有什么我错过了吗?

以下是Memoizable已被弃用的提交(和后续讨论): https : //github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

作者提倡使用@foo ||= ...方法,并将此提交作为迁移示例: https : //github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3 。

编辑:请注意,我不一定解释这种变化意味着memoize所有实例可以或应该被这个模式replace。 我把它理解为意味着,在Rails代码中不再需要Memoizable。 正如评论指出的那样,Memoizable不仅仅是@foo ||= ...的包装。 如果您需要这些function,请继续使用Memoizable,您只需要从ActiveSupport以外的地方获取它(我猜如果他们还没有的话,有人会分叉一个gem版本)。

另一种select是使用Memoistgem:

  • 在GitHub上的备忘录
  • RubyGems的备忘录

它是从ActiveSupport::Memoizable直接提取的,可以用作替代品。 只require 'memoist'和改变

 extend ActiveSupport::Memoizable 

 extend Memoist 

除了最上面的答案,要记忆一个类的方法使用以下模式:

 class Foo class << self def bar @bar ||= begin # ... end end end end 

根据avaynshtok上面提到 的提交的意见,我将这样做:

 ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable } 

…因为我想我会知道什么时候Memoizable从我的RSpec套件的Memoizable中被剔除出去,直到出门。