2012-07-13 7 views
10

यहाँ मान लें कि कुछ मनमाने ढंग से पुस्तकालय कोड है कि मैं के बारे में पता नहीं है।क्या मुझे पता चल सकता है कि एक विधि ओवरराइड कर दी गई है?</p> <pre><code>class Foo def hi end end class Bar < Foo def hi end end </code></pre> <p>और लगता है मैं कुछ कोड है, जहां मैं एक पैरामीटर के रूप में पारित कर रहा हूँ <code>Bar</code> है:

def check(x) 
    do_something_with(x.method(:hi)) 
end 

उपरोक्त उदाहरण में, मैं जानता हूँ कि कर सकते हैं कि x.hi (जहां x संदर्भ Bar का एक उदाहरण) विभिन्न Foo#hi से है?


गैरेथ के जवाब के आधार पर, यह मैं अब तक क्या मिल गया है है:

def is_overridden?(method) 
    name = method.name.to_sym 
    return false if !method.owner.superclass.method_defined?(name) 
    method.owner != method.owner.superclass.instance_method(name).owner 
end 

हाइडियस? भव्य?

+0

हालांकि यह जरूरी नहीं है, मैं उत्सुक हूं कि आप ऐसा क्यों करना चाहते हैं। –

+0

इसके अलावा, ऐसा लगता है कि आप केवल उसी वर्ग पर मौजूदा विधि को फिर से परिभाषित करने के विरोध में विरासत के संबंध में "ओवरराइडिंग" की परवाह करते हैं? –

उत्तर

9

आप ऐसा कर सकता है:

if x.method(:hi).owner == Foo 

मैं एक रूबी विशेषज्ञ होने से दूर हूँ, अगर किसी के पास इससे बेहतर तरीका है तो मुझे आश्चर्य नहीं होगा।

+0

अच्छा! बस एक ही चीज़ में बस ठोकर खाई। और आप की तरह- मैं यह देखने के लिए इंतजार करूंगा कि कोई और साथ आता है और इस दृष्टिकोण के लिए हमें नीचे गोली मारता है। यदि नहीं, तो मैं इसे स्वीकार करूँगा क्योंकि मुझे लगता है कि मैं इसका उपयोग करने के लिए इसका उपयोग कर सकता हूं। –

+0

@DanTao यह आपके मामले में कोई फर्क नहीं पड़ता, लेकिन अगर 'फू' बंदर-पैच है, तो यह अभी भी रिपोर्ट करेगा कि 'फू' मालिक है। –

+0

मैं वास्तव में नहीं देखता कि यह उस मामले में और कुछ कैसे कर सकता है। (और बंदर-पैचिंग * वैसे भी ओवरराइड नहीं है।) क्या मुझे कुछ याद आ रही है? –

0

दिलचस्प सवाल! मैं एक ही सवाल के बारे में सोच रहा था। आप बार क्लास को फिर से खोल सकते हैं और जांच सकते हैं कि बार के लुकअप पथ में पूर्वजों कौन हैं जिन्हें विधि परिभाषित किया गया है।

class Bar < Foo 
    ancestors.each do |ancestor| 
    puts ancestor if ancestor.instance_methods.include?(:hi) 
    end 
end 
संबंधित मुद्दे

 संबंधित मुद्दे