Ruby クラスのインスタンス内からそのインスタンス専用のメソッドを作成する方法はありますか? 質問する

Ruby クラスのインスタンス内からそのインスタンス専用のメソッドを作成する方法はありますか? 質問する

次のように定義します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

おすすめ記事