2009-12-31 12 views
8

मैं यह जांचने की कोशिश कर रहा हूं कि Module.method_defined?(:method) का उपयोग कर मॉड्यूल में कोई विधि परिभाषित की गई है और यह गलत लौट रहा है, इसे सत्य को पुनर्प्राप्त करना चाहिए।Module.method_defined क्यों नहीं है? (: विधि) सही तरीके से काम करता है?

module Something 
    def self.another 
    1 
    end 
end 

Something.methods 'एक और' सूचीबद्ध लेकिन Something.method_defined?(:another) रिटर्न false है।

क्या यह शायद काम नहीं कर रहा है क्योंकि विधि स्वयं पर परिभाषित है? यदि यह मामला है कि यह जांचने का कोई और तरीका है कि विधि को method_defined? का उपयोग करने के अलावा मॉड्यूल पर परिभाषित किया गया है या नहीं?

उत्तर

10

यह जानने के लिए कि क्या मॉड्यूल में मॉड्यूल विधि है, आप answer_to का उपयोग कर सकते हैं? मॉड्यूल पर:

Something.respond_to?(another) 
=> true 

method_defined? आपको बताएगा कि मॉड्यूल के साथ कक्षा के इंस्टॉलेशन में दिए गए तरीके का जवाब शामिल है या नहीं।

+2

शायद मैं यह गलत पढ़ रहा हूं, लेकिन यह 'Something.respond_to? (: दूसरा) नहीं होना चाहिए, इसलिए' दूसरा 'प्रतीक है। अन्यथा 'अन्य' एक अपरिभाषित त्रुटि का कारण नहीं होगा? –

5

मॉड्यूल विधियों को मेटाक्लास में परिभाषित किया गया है। तो तुम भी साथ विधि शामिल करने के लिए जाँच कर सकते हैं:

k = class << Something; self; end # Retrieves the metaclass 
k.method_defined?(:another) #=> true 

आप Understanding Ruby Metaclasses में इसके बारे में अधिक पढ़ सकते हैं।

+0

उस साइट पर चित्र कम से कम कहने में भ्रमित है। उदाहरण से 'विरासत' वर्ग के तरीकों से इसका क्या अर्थ है? मुझे गलत शब्दावली की तरह लगता है। इसके अलावा मेटाक्लास पर इशारा करते हुए 'instance_eval' लेबल वाले तीर से इसका क्या अर्थ है? 'instance_eval' मूल्यांकन मेटाक्लास पर नहीं होता है, यह उदाहरण पर होता है - 'instance_eval' में' def' का व्यवहार होने वाला एकमात्र अपवाद जो मेटाक्लास पर विधियों को परिभाषित करता है। – horseyguy

+0

धन्यवाद! सुनिश्चित नहीं है कि दूसरा उत्तर चेकमार्क क्यों जाता है। वास्तव में ऐसा करने का यह तरीका है। –

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