2010-07-28 9 views
13

स्थिति किस तरह में कोड है विस्तारित, और उत्तरार्द्ध सिर्फ एक वर्ग विधि है, लेकिन जब किसी भी विधि को बुलाते हैं, तो आपको M.greet करना होगा, है ना? मैं उत्सुक था कि अगर कोई दूसरे पर एक कोड का उपयोग करने के लिए कुछ प्रकाश डाल सकता है। धन्यवाद!रूबी मॉड्यूल और विस्तार स्वयं

उत्तर

13

पहला उदाहरण आम तौर पर एक तरह से लोगों module_function की कार्यक्षमता को प्राप्त (जब वे के अस्तित्व नहीं जानता है यह विधि)।

module_function दोनों एक उदाहरण विधि और एक क्लास विधि है। आपके दूसरे कोड उदाहरण में विधि केवल एक क्लास विधि है।

+0

ओह, यह एक अच्छी विधि है। इस तरह आप चुन सकते हैं कि यदि आप इसे सभी को देना नहीं चाहते हैं तो कार्यक्षमता देने के लिए कौन सी विधियां हैं। धन्यवाद! – joeellis

9

यह आपकी पहली उदाहरण के साथ ऐसा करना संभव हो जाएगा, लेकिन नहीं अपने दूसरे:

include M 
greet 
2

मॉड्यूल विधियों को लिखकर एक मॉड्यूल को नामस्थान के रूप में उपयोग किया जा सकता है, और मॉड्यूल के उदाहरण विधियों को किसी अन्य ऑब्जेक्ट में मिश्रित किया जा सकता है।

स्वयं विस्तारित मॉड्यूल अवधारणा मॉड्यूल को दोनों तरीकों से उपयोग करने की अनुमति देता है; या तो स्टैंड-अलोन नेमस्पेस या मिक्सीन के रूप में। इस मॉड्यूल पर विचार करें:

module M 
    def bar 
    puts "bar" 
    end 
end 
class C 
    include M 
end 

इसमें एक उदाहरण विधि है और इसे किसी अन्य ऑब्जेक्ट में मिश्रित किया जा सकता है। एक मॉड्यूल एक बस वर्ग Module की एक वस्तु है

puts M::bar # => undefined method `bar' for M:Module 
puts C.bar # => this is bar 

लेकिन, जैसा कि हम

puts M.class # => Module 

इस साधन का प्रदर्शन कर सकते: यह एक मॉड्यूल विधि नहीं है और नहीं, इसलिए एक नाम स्थान के रूप में इस्तेमाल किया जा सकता कि हम कुछ पागल कर सकते हैं। हम एक मॉड्यूल को अपने आप में मिला सकते हैं ताकि इसकी विधियां इंस्टेंस और मॉड्यूल विधियों दोनों बन जाए।

module M 
    extend self 
    def bar 
    puts "bar" 
    end 
end 
puts M::bar # => this is bar 
puts C.bar # => this is bar