ActiveSupport::Memoizable 指的是哪种 Ruby memoize 模式?
Posted
技术标签:
【中文标题】ActiveSupport::Memoizable 指的是哪种 Ruby memoize 模式?【英文标题】:Which Ruby memoize pattern does ActiveSupport::Memoizable refer to? 【发布时间】:2012-02-26 06:43:33 【问题描述】:所以在 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 pattern”(单数),好像有一种我们都应该知道并参考的模式......
我猜他们的意思是这样的:
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
还有什么我错过的吗?
【问题讨论】:
如果你想要 'false' 或 'nil',它不会被 Ruby 的 memoizable 保存。因此,如果您想实现自己的可记忆包装器,请添加一种保存“false”和“nil”的方法。 作为旁注(偶然发现这个古老的问题),我建议将“rose memoization”作为这种模式的名称:thepugautomatic.com/2016/01/rose-memoization @HenrikN 我偶然发现了你的博客几次。很高兴在这里遇到你 【参考方案1】:这是不推荐使用 Memoizable 的提交(以及后续讨论):https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
作者提倡@foo ||= ...
方式,并以points to this commit为例进行迁移:https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3。
编辑:
请注意,我不一定将此更改解释为意味着memoize
的所有实例都可以或应该用此模式替换。我将其理解为 Rails 代码本身不再需要/不需要 Memoizable。正如 cmets 所指出的,Memoizable 不仅仅是 @foo ||= ...
的包装。如果您需要这些功能,请继续使用 Memoizable,您只需要从 ActiveSupport 以外的其他地方获取它(我猜有人会分叉一个 gem 版本,如果他们还没有的话)。
【讨论】:
【参考方案2】:另一种选择是使用 Memoist gem:
Memoist on GitHub Memoist on RubyGems它是从ActiveSupport::Memoizable
中直接提取的,可以用作替代品。只需require 'memoist'
并更改
extend ActiveSupport::Memoizable
到
extend Memoist
【讨论】:
【参考方案3】:只是对最佳答案的补充,要记住类方法,请使用以下模式:
class Foo
class << self
def bar
@bar ||= begin
# ...
end
end
end
end
【讨论】:
【参考方案4】:根据the commitreferenced above by avaynshtok 上的 cmets,我会这样做:
ActiveSupport::Deprecation.silence extend ActiveSupport::Memoizable
...因为我想我会知道什么时候Memoizable
会从我的 RSpec 套件中从 ActiveSupport 中删除,而我的 RSpec 套件一开始就死了。
【讨论】:
以上是关于ActiveSupport::Memoizable 指的是哪种 Ruby memoize 模式?的主要内容,如果未能解决你的问题,请参考以下文章