रूबी में एक निश्चित वर्ग विधि के लिए परिभाषित सुपर विधियों की सूची - रूबी, विरासत, प्रतिबिंब, मिश्रण, सुपर

मैं कुछ जटिल के साथ एक प्रणाली पर काम कर रहा हूँकक्षा / मिश्रण पदानुक्रम। चूंकि कई अलग-अलग फाइलों पर बिखरे कई कई परतें हैं, इसलिए मैं तुरंत देखना चाहता हूं कि सुपर कॉल की श्रृंखला किसी दिए गए विधि के लिए क्या है।

उदाहरण के लिए

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", ...]

उत्तर:

उत्तर № 1 के लिए 1

शायद ऐसा कुछ?

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]

यदि यह सही लगता है, तो आप इस कार्य को तदनुसार संशोधित कर सकते हैं:

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

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

जवाब के लिए 0 № 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

संबंधित सवाल
सबसे लोकप्रिय