मैं बेहतर समझने की कोशिश कर रहा हूं कि मॉड्यूल कैसे विस्तार करते हैं और एक दूसरे को शामिल करते हैं।रूबी: मॉड्यूल का विस्तार/मॉड्यूल सहित
module B
extend A
end
B.learned_from_A # true
मैं भोलेपन है सी सब कुछ देने के लिए बी प्रयास:
module A
def learned_from_A
true
end
end
A.instance_methods # [:learned_from_A]
मैं बी में चाल के अपने बैग मिश्रण:
मैं मॉड्यूल एक है कहो :
module C
extend B
end
C.learned_from_A # NoMethodError
मुझे लगता है कि मैंने इसके चारों ओर अपना सिर लपेट लिया है।
B.singleton_methods # [:learned_from_A]
जबकि : बीएक फैली है, एक का उदाहरण तरीकों की प्रतियां बी की सिंगलटन वर्ग के माध्यम से बी लिए बाध्य कर रहे learned_from_Aबी पर प्रतिदेय है, यह के बी एक नहीं है के उदाहरण तरीकों, इसलिए जब सी फैली बी, : learned_from_Aसी पर प्रतिलिपि बनाई गई है।
तो बी बजाय एक, एक का उदाहरण तरीकों की प्रतियां बी के अपने उदाहरण के तरीकों में शामिल किया गया है जाएगा शामिल थे। सी में कॉपी किया जाएगा और बाध्य: (learned_from_Aसहित)
module B
include A
end
B.instance_methods # [:learned_from_A]
फिर, सीबी, और बी का उदाहरण तरीकों के सभी का विस्तार कर सकते हैं। learned_from_A दोनों बी पर प्रतिदेयऔरसी, बी का विस्तार कर सकता है और शामिल एक:
module C
extend B
end
C.singleton_methods # [:learned_from_A]
बनाने के लिए।
module B
include A
extend A
end
B.instance_methods # [:learned_from_A]
B.singleton_methods # [:learned_from_A]
module C
extend B
end
C.instance_methods # []
C.singleton_methods # [:learned_from_A]
अधिक वास्तविक है, अगर मैं एक के तरीकों बी पर प्रतिदेय होना चाहता हूँ, और बी के लिए, अपने स्वयं के का एक और तरीका और मिश्रण करने में सक्षम हो परिभाषित करने के लिए सी में पूरी प्रदर्शनों की सूची है, मैं ऐसा नहीं कर सकते:
module B
extend A
include A
def self.buzz
true
end
end
module C
extend B
end
बी केवल इसके इंस्टेंस विधियों को साझा कर सकता है, न कि इसकी सिंगलटन विधियों। तो एक विधि दोनों बी पर प्रतिदेय और अन्य वस्तुओं को साझा करने योग्य बनाने के लिए, यह बी में ही एक उदाहरण विधि के रूप में परिभाषित किया और बढ़ाया जाना चाहिए:
module B
extend A
include A
extend self
def buzz
true
end
end
module C
extend B
end
परीक्षण भी पर्याप्त मात्रा में नहीं था और यह सब एक साथ रखने में त्रुटि। क्या यह देखने का एक सही तरीका है कि क्या हो रहा है?
क्या आपके प्रश्न को सरल बनाने का कोई तरीका है? भले ही आप इसे अलग-अलग परिदृश्यों के साथ एक गलती में डाल दें। – onebree
मुझे लगता है कि जब आप बी के अंदर विस्तार कर रहे हैं तो आप स्वयं के दायरे में परिवर्तन को भ्रमित कर सकते हैं, और उसके बाद उम्मीद है कि सी में ए होगा। आप स्कोप बदलते हैं। #prepend भी कहा जा सकता है। यह देखने के लिए कि इन स्कॉप्स कैसे बदलते हैं, अपनी कक्षा में $ पूर्वजों की विधि को कॉल करें। –
लगता है जैसे आप माँ और बेटी दोनों को एक ही नाम से कॉल करना चाहते हैं: पी –