2010-03-01 12 views
40

extend self और module_function इसे बनाने के लिए दो रूबी तरीके हैं ताकि आप मॉड्यूल पर एक विधि को कॉल कर सकें और यदि आप उस मॉड्यूल को शामिल करते हैं तो इसे कॉल भी करें।"मॉड्यूल_फंक्शन" जैसा ही "स्वयं को बढ़ाएं" है?

क्या उन तरीकों के अंतिम परिणामों के बीच कोई अंतर है?

उत्तर

52

module_function दिए गए इंस्टेंस विधियों को निजी बनाता है, फिर डुप्लिकेट करता है और उन्हें मॉड्यूल के मेटाक्लास को सार्वजनिक तरीकों के रूप में रखता है। extend self मॉड्यूल के सिंगलटन में सभी इंस्टेंस विधियों को जोड़ता है, जिससे उनकी दृश्यता अपरिवर्तित हो जाती है।

module M 
    extend self 

    def a; end 

    private 
    def b; end 
end 

module N 
    def c; end 

    private 
    def d; end 

    module_function :c, :d 
end 

class O 
    include M 
    include N 
end 

M.a 
M.b # NoMethodError: private method `b' called for M:Module 
N.c 
N.d 
O.new.a 
O.new.b # NoMethodError: private method `b' called for O 
O.new.c # NoMethodError: private method `c' called for O 
O.new.d # NoMethodError: private method `d' called for O 
+3

हाँ module_function वर्ग तरीकों सार्वजनिक हैं, लेकिन उदाहरण के तरीकों निजी – horseyguy

+1

module_function "नाम तरीकों के लिए मॉड्यूल कार्यों बनाता है। इन कार्यों एक रिसीवर के रूप में मॉड्यूल के साथ कहा जा सकता है, और यह भी कक्षाओं के लिए उदाहरण के तरीके के रूप में उपलब्ध हो जाते हैं कि मॉड्यूल में मिश्रण। मॉड्यूल फ़ंक्शंस मूल की प्रतियां हैं, और इसलिए स्वतंत्र रूप से बदला जा सकता है। उदाहरण-विधि संस्करण निजी बनाये जाते हैं। यदि कोई तर्क नहीं होता है, तो बाद में परिभाषित विधियां मॉड्यूल फ़ंक्शन बन जाती हैं। " स्रोत: http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module.module_function – mysmallidea

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