Ruby クラス (Ruby 2.0.0p247) にいくつかのモジュールを含めています。一部は同じインスタンス メソッドを定義し、すべて同じクラスに含まれています。各メソッド名シンボルのハッシュを、そのメソッドを実装する継承階層内のクラスのリストに生成して、それらが実行されるようにするコードが必要です。どうすればいいですか?
x
(そうすれば、各メソッドをいつ呼び出すかがわかります。それぞれが行う場合super if defined?(super)
、メソッドの実行順序がわかります。)
たとえば、インスタンス メソッド x を実装するクラス C があり、C にはインスタンス メソッド x を実装するモジュール A と B が含まれている場合、いくつかのコードを使用して C を検査し、次のような結果を得ることができます。
=> {:x=>[C, A, B], ...}
明確にするために、C で定義されたメソッドだけでなく、モジュールとクラス継承によって継承されるすべてのメソッドを知りたいと思います。
私が探しているものを示す別の例:
module A
def v
end
def x
end
end
module B
def x
end
def y
end
end
module D
def a
end
end
class E
include A, B
def x
end
def y
end
def z
end
end
class C < E
include D
end
そのため、C の結果は次のようになります。
=> {:a=>[D], :x=>[E, A, B], :y=>[E, B], :z=>[E], :v=>[A], :nil?=>[Kernel], :====>[Kernel], :=~=>[Kernel], :!~=>[Kernel], :eql?=>[Kernel], :hash=>[Kernel], :<=>=>[Kernel], :class=>[Kernel], :singleton_class=>[Kernel], :clone=>[Kernel], :dup=>[Kernel], :taint=>[Kernel], :tainted?=>[Kernel], :untaint=>[Kernel], :untrust=>[Kernel], :untrusted?=>[Kernel], :trust=>[Kernel], :freeze=>[Kernel], :frozen?=>[Kernel], :to_s=>[Kernel], :inspect=>[Kernel], :methods=>[Kernel], :singleton_methods=>[Kernel], :protected_methods=>[Kernel], :private_methods=>[Kernel], :public_methods=>[Kernel], :instance_variables=>[Kernel], :instance_variable_get=>[Kernel], :instance_variable_set=>[Kernel], :instance_variable_defined?=>[Kernel], :remove_instance_variable=>[Kernel], :instance_of?=>[Kernel], :kind_of?=>[Kernel], :is_a?=>[Kernel], :tap=>[Kernel], :send=>[Kernel], :public_send=>[Kernel], :respond_to?=>[Kernel], :extend=>[Kernel], :display=>[Kernel], :method=>[Kernel], :public_method=>[Kernel], :define_singleton_method=>[Kernel], :object_id=>[Kernel], :to_enum=>[Kernel], :enum_for=>[Kernel], :===>[BasicObject], :equal?=>[BasicObject], :!=>[BasicObject], :!==>[BasicObject], :instance_eval=>[BasicObject], :instance_exec=>[BasicObject], :__send__=>[BasicObject], :__id__=>[BasicObject]}