特定のオブジェクトにシングルトン メソッドを追加したいと考えています。オブジェクトのインスタンスメソッドが最初に呼び出されたときに、何らかの作業を行い、同じ名前のオブジェクト (作業を含む) のシングルトンメソッドを作成することを望みます。このオブジェクトに対する後続のすべての呼び出しでは、シングルトン メソッドがインスタンス メソッドをシャドウして呼び出されます。
私はシングルトンメソッドを作成する方法を知っています.私の問題は、ラムダを呼び出すために作成されたシングルトンメソッドが欲しいということです(l
この場合)。def はクロージャーを作成しないため、メソッドが後で呼び出されるときに変数 l (以下のコード) を参照できません (l.call()
この例ではコメントアウトされています) 特定のオブジェクトでシングルトン メソッドを作成するときにクロージャーを作成する方法を知りたいです. どんな助けでも大歓迎です。ありがとうございました。
class Thing
end
t = Thing.new
t2 = Thing.new
Thing.instance_eval() do
def speak
puts "I speak for all Things, I am a class method"
end
end
Thing.class_eval() do
def speak
puts "This is the instance method referenced by the Thing object #{self}"
r = "something I wish to hold on to, maybe expensive to calculate"
l = lambda {puts r}
instance_eval() do
def speak()
puts "This is the singleton method in the Thing object #{self}"
#l.call() # I want this to work! How?
end
end
end
end
Thing.speak()
t.speak()
t2.speak()
t.speak()
t2.speak()
実行すると、次の結果が得られます: (「<」を「#」に変更して、html に表示されるようにしました)
私はすべてのものを代弁します、私はクラスメソッドです
これは Thing オブジェクトによって参照されるインスタンス メソッドです #Thing:0x1d204>
これは Thing オブジェクトによって参照されるインスタンス メソッドです #Thing:0x1d1dc>
これは Thing オブジェクトのシングルトン メソッドです #Thing:0x1d204>
これは Thing オブジェクトの singleton メソッドです #Thing:0x1d1dc>