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 模式?的主要内容,如果未能解决你的问题,请参考以下文章