Liste des super méthodes définies pour une certaine méthode de classe en ruby ​​- ruby, héritage, réflexion, mixins, super

Je travaille sur un système avec un certain complexehiérarchie classe / mixin. Comme il y a plusieurs couches dispersées sur de nombreux fichiers, je veux voir rapidement quelle est la chaîne de super appels pour une méthode donnée.

Par exemple

module AAA
def to_s
"AAA " + super()
end
end

module BBB
def to_s
"BBB " + super()
end
end

class MyArray < Array
include AAA
include BBB

def to_s
"MyArray " + super()
end
end

> MyArray.new.to_s
=> "MyArray BBB AAA []"
> method_supers(MyArray,:to_s)
=> ["MyArray#to_s", "BBB#to_s", "AAA#to_s", "Array#to_s", ...]

Réponses:

1 pour la réponse № 1

Peut-être quelque chose comme ça?

class A
def foo; p :A; end
end

module B
def foo; p :B; super; end
end

module C; end

class D < A
include B, C
def foo; p :D; super; end
end

p D.ancestors.keep_if { |c| c.instance_methods.include? :foo }  # [D, B, A]

Si cela semble correct, vous pouvez modifier cette fonction en conséquence:

def Object.super_methods(method)
ancestors.keep_if { |c| c.instance_methods.include? method }
end

p D.super_methods(:foo)  # [D, B, A]

0 pour la réponse № 2
def method_supers(child_class,method_name)
ancestry = child_class.ancestors

methods = ancestry.map do |ancestor|
begin
ancestor.instance_method(method_name)
rescue
nil
end
end

methods.reject!(&:nil?)

methods.map {|m| m.owner.name + "#" + m.name.to_s}
end

questions connexes
Menu