ruby - 如何在不重复代码的情况下记住一个类的所有实例?
问题描述
我正在使用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
是无效的。
解决方案
您只需要在正确的对象上调用方法:
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
再次调用,从而包装已经包装的方法,然后包装已经包装的方法的包装器,然后包装已经包装的方法的包装器的包装器,依此类推。
推荐阅读
- elasticsearch - Elasticsearch:重新索引问题 - 以不止一种类型结束
- python - 我不知道为什么我的代码一直显示这个结果
- java - 如何在一个类中为两个不同的任务创建一个单独的 HashMap 成员,在两个不同的构造函数中进行不同的初始化
- angular - Angular Material - 如何更改 mat-drawer-container 的背景颜色
- python - 将一定数量的变量从一组添加到另一组
- javascript - 不要在循环中创建函数,.then 应该返回一个值或抛出
- javascript - Javascript - 如何对这样一个数组中的值求和?
- export - 如何从 Progress OpenEdge 数据库服务器导出数据
- javascript - Gatsby createPages 生命周期方法在 onCreateNode 方法完成添加所需节点字段之前运行
- r - 有没有办法使用 R 将不同年级的学生列表放入不同的班级选项中?