編集:明確にするために。これは、メタ プログラミングで何かを行う方法についての質問です。メモすることではありません。明らかに、メモ化するためのより良い方法があります。関連するメソッドには、その目的を説明するために「メモ化」が含まれています。
@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
インスタンス バージョンは機能しますが、クラス バージョンは機能しません。
参照用にクラス バージョンを試してみました。