首页 > 解决方案 > 如何在不重复代码的情况下记住一个类的所有实例?

问题描述

我正在使用Memoist,我有一个特定的案例,我的班级的所有方法都需要被记忆。我希望能够记住它们而无需memoize :instance_method_name为每个方法编写。我想做类似的事情:

class MyClass
  extend Memoist

  def initialize
    instance_methods(false).each(&:memoize)
  end

  private

  def method1
  end

  def method2
  end

  def method3
  end
end

但当然它不起作用,因为它instance_methods是无效的。

标签: rubymemoization

解决方案


您只需要在正确的对象上调用方法:

class MyClass
  extend Memoist

  private

  def method1
  end

  def method2
  end

  def method3
  end

  instance_methods(false).each(&method(:memoize))
end

Module#instance_methods是类的实例方法Module,而不是类的实例方法MyClass。因此,您需要在 的实例上调用它Module,而不是在 的实例上调用MyClass

同样,您正在调用Memoist#memoize的实例Symbol,但您需要在 的实例上调用它Memoist,即在本例中为MyClass

请注意,即使您编写的代码确实有效,它也不会像您认为的那样做。memoize通过用包装和缓存旧方法的新方法替换该方法来工作。但是,如果您的代码按照您希望的方式工作,则每次创建新对象时,它都会memoize 再次调用,从而包装已经包装的方法,然后包装已经包装的方法的包装器,然后包装已经包装的方法的包装器的包装器,依此类推。


推荐阅读