1

渡されたクラスをいじくり回す関数を作成したいと思います。これらのクラスを再度開いて機能を追加する最も慣用的な方法は何でしょうか。これが私が意味することです:

def class_messer(target_object)
  #would like to reopen class here with something like:
  class target_object.class
    #add methods
  end
end

明らかに、その構文は機能しません。target_objectのクラスを取得し、いくつかの文字列を評価することはできますが、それはひどい感じです。これを行うためのより慣用的な方法はありますか?

4

4 に答える 4

5

私はあなたが探していると思いますclass_eval。クラスを再度開きたいが、定数はそのままではなく参照がある場合は、クラスを呼び出しclass_evalて、そのクラスのコンテキストで評価されるコードのブロック(または文字列)を渡すことができます。

def class_messer(target_object)

  # assuming that target_object is an instance of desired class

  target_object.class.class_eval do
    #add methods
  end

end
于 2012-08-30T17:09:49.830 に答える
2

クラスを変更するのは正しくないかもしれません。たとえば、Arrayクラスのインスタンスがあり、そのクラスを変更した場合、この変更はArrayクラスの他のインスタンスに影響を与える可能性があります。したがって、代わりにインスタンスのシングルトンクラスを使用すると、メソッドの定義は次のようになります。

target_object.send(:define_method, :new_method) do
  #... 
end

また

class << target_object
  def new_method
    #...
  end
end
于 2012-08-30T16:32:22.650 に答える
2
target_object.class.class_exec do
  # add methods
end
于 2012-08-30T16:10:43.413 に答える
0

これを行うこともできます:

class << target_object.class

end
于 2012-08-30T16:21:07.157 に答える