如何在没有重复代码的情况下记住 class 的所有实例?

How to memoize all instances of a class without repeated code?

我正在使用 Memoist 并且我有一个特定的案例,我的 class 的所有方法都需要被记住。我希望能够记住它们而无需为每种方法编写 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 无效。

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

class MyClass
  extend Memoist

  private

  def method1
  end

  def method2
  end

  def method3
  end

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

Module#instance_methods is an instance method of the Moduleclass,不是MyClassclass的实例方法。因此,您需要在 Module 的实例上调用它,而不是在 MyClass.

的实例上调用它

同样,您正在调用 Memoist#memoize on an instance of Symbol, but you need to call it on an instance of Memoist,即在本例中 MyClass

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