स्थिति किस तरह में कोड है विस्तारित, और उत्तरार्द्ध सिर्फ एक वर्ग विधि है, लेकिन जब किसी भी विधि को बुलाते हैं, तो आपको M.greet करना होगा, है ना? मैं उत्सुक था कि अगर कोई दूसरे पर एक कोड का उपयोग करने के लिए कुछ प्रकाश डाल सकता है। धन्यवाद!रूबी मॉड्यूल और विस्तार स्वयं
उत्तर
पहला उदाहरण आम तौर पर एक तरह से लोगों module_function
की कार्यक्षमता को प्राप्त (जब वे के अस्तित्व नहीं जानता है यह विधि)।
ए module_function
दोनों एक उदाहरण विधि और एक क्लास विधि है। आपके दूसरे कोड उदाहरण में विधि केवल एक क्लास विधि है।
यह आपकी पहली उदाहरण के साथ ऐसा करना संभव हो जाएगा, लेकिन नहीं अपने दूसरे:
include M
greet
मॉड्यूल विधियों को लिखकर एक मॉड्यूल को नामस्थान के रूप में उपयोग किया जा सकता है, और मॉड्यूल के उदाहरण विधियों को किसी अन्य ऑब्जेक्ट में मिश्रित किया जा सकता है।
स्वयं विस्तारित मॉड्यूल अवधारणा मॉड्यूल को दोनों तरीकों से उपयोग करने की अनुमति देता है; या तो स्टैंड-अलोन नेमस्पेस या मिक्सीन के रूप में। इस मॉड्यूल पर विचार करें:
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
ओह, यह एक अच्छी विधि है। इस तरह आप चुन सकते हैं कि यदि आप इसे सभी को देना नहीं चाहते हैं तो कार्यक्षमता देने के लिए कौन सी विधियां हैं। धन्यवाद! – joeellis