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
中被剔除出去,直到出门。