2015-11-21 23 views
8

मैं बेहतर समझने की कोशिश कर रहा हूं कि मॉड्यूल कैसे विस्तार करते हैं और एक दूसरे को शामिल करते हैं।रूबी: मॉड्यूल का विस्तार/मॉड्यूल सहित

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 

परीक्षण भी पर्याप्त मात्रा में नहीं था और यह सब एक साथ रखने में त्रुटि। क्या यह देखने का एक सही तरीका है कि क्या हो रहा है?

+0

क्या आपके प्रश्न को सरल बनाने का कोई तरीका है? भले ही आप इसे अलग-अलग परिदृश्यों के साथ एक गलती में डाल दें। – onebree

+0

मुझे लगता है कि जब आप बी के अंदर विस्तार कर रहे हैं तो आप स्वयं के दायरे में परिवर्तन को भ्रमित कर सकते हैं, और उसके बाद उम्मीद है कि सी में ए होगा। आप स्कोप बदलते हैं। #prepend भी कहा जा सकता है। यह देखने के लिए कि इन स्कॉप्स कैसे बदलते हैं, अपनी कक्षा में $ पूर्वजों की विधि को कॉल करें। –

+1

लगता है जैसे आप माँ और बेटी दोनों को एक ही नाम से कॉल करना चाहते हैं: पी –

उत्तर

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