2011-03-30 15 views
19

मैं आसानी से अन्य वर्गों के लिए कुछ उदाहरण और वर्ग के तरीकों में जोड़ने के लिए मॉड्यूल के एक जोड़े को परिभाषित करने के कोशिश कर रहा हूँ अंदर मॉड्यूल का विस्तार, यहाँ मैं क्या कर रहा है:माणिक - एक और मॉड्यूल

module Foo 
    module Bar 
    def speak 
     puts "hey there" 
    end 
    end 
    module Baz 
    extend Foo::Bar 

    def welcome 
     puts "welcome, this is an instance method" 
    end 
    end 
end 

class Talker 
    include Foo::Baz 
end 

Talker.new.welcome 
Talker.speak 

के उत्पादन यह है:

welcome, this is an instance method 
undefined method 'speak' for Talker.class (NoMethodError) 

मैं वार्ताकारचयनिक 'बात' विधि है, क्योंकि यह फू :: बाज जो अपने आप में फैली हुई है फू :: बार शामिल है उम्मीद कर रहा था।

मुझे क्या याद आ रही है?

+0

इसलिए यदि मैं मॉड्यूल के बजाय बाज़ को कक्षा बना देता हूं और मैं टॉकर बदलता हूं तो यह बाज़ को उप-वर्गीकृत करता है, मेरा उदाहरण काम करता है। लेकिन क्या ऐसा करना संभव है जो मैं बाज़ को कक्षा के बिना करने की कोशिश कर रहा था? (और टॉकर :: Foo :: Bar.speak जैसे कुछ करने के बिना?) – codecraig

उत्तर

20

आप इस कोशिश कर सकते हैं:

module Baz 
    extend Foo::Bar 

    def self.included(base) 
    base.send :extend, Foo::Bar 
    end 

    def welcome 
    puts "welcome, this is an instance method" 
    end 
end 

इस वसीयत में सभी वर्गों के ऑटो का विस्तार

एक संभावना यह अन्य संशोधित करने से यह eigenclass है उपयोग करने के लिए (ऊपर के रूप में) 'का विस्तार' है विज़ बाज़ शामिल है।

+0

अच्छा, धन्यवाद! यह मुझे वह चाहता है जो मैं चाहता था। – codecraig

+1

क्यों 2 फू :: बार का विस्तार? एक अंदर शामिल है और एक बाहर है। – shajin

+1

पहले विस्तारित Foo :: Bar से Baz तक क्लास लेवल विधियों को जोड़ता है। दूसरा, फू :: बार से सभी वर्गों और मॉड्यूल में विधियों को जोड़ता है जिनमें बाज़ शामिल है। –

4

इस प्रयास करें:

class Talker 
    extend Foo::Baz 
end 

जब से तुम Talker.speak एक वर्ग पद्धति के रूप में और नहीं (Talker.new.speak) की तरह एक उदाहरण विधि के रूप में कॉल करने के लिए आप कम महत्वपूर्ण चीज़ों शामिल करने के लिए करना चाहते हैं: एक में बाज जिस तरह से वर्ग विधियों को स्वयं ले जाएगा।

class Talker 
    class << self 
    include Foo::Baz 
    end 
end