次のように定義しますclass Example
。
class Example
def initialize(test='hey')
self.class.send(:define_method, :say_hello, lambda { test })
end
end
を呼び出すと、Example.new; Example.new
が返されますwarning: method redefined; discarding old say_hello
。これは、実際のクラスでメソッドが定義されているためであるに違いないと結論付けました (構文からすると、これは理にかなっています)。そしてもちろん、Example
メソッドに異なる値を持つ のインスタンスが複数あると、悲惨な結果になります。
クラスのインスタンス内からそのインスタンス専用のメソッドを作成する方法はありますか?
ベストアンサー1
インスタンスのシングルトン クラス (インスタンス固有のものをすべて保持するクラス) への参照を取得し、そのクラスにメソッドを定義する必要があります。Ruby 1.8 では、少し面倒に見えます。(よりクリーンな解決策が見つかったら、教えてください!)
ルビー1.8
class Example
def initialize(test='hey')
singleton = class << self; self end
singleton.send :define_method, :say_hello, lambda { test }
end
end
しかし、Ruby 1.9 では、はるかに簡単な方法が提供されています。
ルビー1.9
class Example
def initialize(test='hey')
define_singleton_method :say_hello, lambda { test }
end
end