如何在没有重复代码的情况下记住 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 Module
class,不是MyClass
class的实例方法。因此,您需要在 Module
的实例上调用它,而不是在 MyClass
.
的实例上调用它
同样,您正在调用 Memoist#memoize
on an instance of Symbol
, but you need to call it on an instance of Memoist
,即在本例中 MyClass
。
请注意,即使您编写的代码确实有效,它也不会像您认为的那样工作。 memoize
的工作原理是用包装和缓存旧方法的新方法替换该方法。但是,如果您的代码按照您希望的方式工作,每次 创建一个新对象时,它会再次调用 memoize
, 从而包装已经包装的方法,然后包装已经包装方法的包装器,再包装已经包装方法的包装器的包装器,依此类推。
我正在使用 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 Module
class,不是MyClass
class的实例方法。因此,您需要在 Module
的实例上调用它,而不是在 MyClass
.
同样,您正在调用 Memoist#memoize
on an instance of Symbol
, but you need to call it on an instance of Memoist
,即在本例中 MyClass
。
请注意,即使您编写的代码确实有效,它也不会像您认为的那样工作。 memoize
的工作原理是用包装和缓存旧方法的新方法替换该方法。但是,如果您的代码按照您希望的方式工作,每次 创建一个新对象时,它会再次调用 memoize
, 从而包装已经包装的方法,然后包装已经包装方法的包装器,再包装已经包装方法的包装器的包装器,依此类推。