编辑:要清楚。这是一个关于如何使用元编程做某事的问题。这不是关于记忆。显然有更好的方法来记忆。相关方法中有“memoize”只是为了说明它们的目的。
我只是在玩元编程,所以请不要回答使用
@foo
实例变量。
我有以下尝试通过覆盖运行方法中的方法定义来记忆实例和类方法。
class Obj
class << self
def meta_me; self; end
def class_memoize
puts "hard core calculating ..."
abc = "huge calculation result"
raise "broken here with infinite loop"
define_class_method "class_memoize" do
puts abc
abc
end
class_memoize
end
def define_class_method name, &blk
meta_me.instance_eval do
define_method name, &blk
end
end
end
def instance_memoize
puts "hard core calculating ..."
abc = "huge calculation result"
self.class.meta_me.send :define_method, :instance_memoize do
puts abc
abc
end
instance_memoize
end
end
o = Obj.new
o.instance_memoize
# hard core calculating ...
# huge calculation result
o.instance_memoize
# huge calculation result
实例版本有效,但类版本无效。
我已经尝试在类版本中进行参考。