2012-10-28 7 views
6

मैं रूबी 1.9.2 और रूबी v3.2.2 मणि ​​पर रूबी का उपयोग कर रहा हूं। मैं मॉड्यूल को शामिल करने के लिए "घोंसला" करना चाहता हूं, मैं RoR ActiveSupport::Concern सुविधा का उपयोग कर रहा हूं, लेकिन मुझे संदेह है कि मुझे include विधि बताई जानी चाहिए। यही कारण है, मैं निम्नलिखित है:रूबी ActiveSupport :: Concern सुविधा पर रूबी का उपयोग करते समय मॉड्यूल को शामिल करने के लिए "घोंसला" कैसे करें?

module MyModuleA 
    extend ActiveSupport::Concern 

    # include MyModuleB 

    included do 
    # include MyModuleB 
    end 
end 

मैं "शरीर" में include MyModuleB राज्य चाहिए/"संदर्भ"/MyModuleA की "गुंजाइश" या मुझे लगता है कि में included do ... end ब्लॉक लिखा होना चाहिए? क्या अंतर है और मुझे इससे क्या उम्मीद करनी चाहिए?

+0

खबरदार है कि यह एक अच्छा अभ्यास बिल्कुल भी नहीं है। मॉड्यूल को शामिल करने के आदेश के बीच आप नकली निर्भरताओं में शामिल हो सकते हैं। – geekazoid

उत्तर

16

यदि आप MyModuleA के "बॉडी" में MyModuleB शामिल करते हैं, तो यह मॉड्यूल स्वयं है जो बी की कार्यक्षमता के साथ बढ़ाया गया है। यदि आप इसे included ब्लॉक में शामिल करते हैं, तो इसे कक्षा में शामिल किया गया है जो MyModuleA में मिश्रित होता है।

यही कारण है:

module MyModuleA 
    extend ActiveSupport::Concern 
    include MyModuleB 
end 

पैदा करता है कुछ की तरह:

class Foo 
    include MyModuleA 
    include MyModuleB 
end 
:

MyModuleA.send :include, MyModuleB 
class Foo 
    include MyModuleA 
end 

जबकि

module MyModuleA 
    extend ActiveSupport::Concern 
    included do 
    include MyModuleB 
    end 
end 

की तरह कुछ का उत्पादन

def MyModuleA 
    def self.included(klass, &block) 
    klass.instance_eval(&block) 
    end 
end 

included ब्लॉक में कोड बल्कि मॉड्यूल के संदर्भ से, सहित वर्ग के संदर्भ में चलाया जाता है:

इस का कारण यह है कि ActiveSupport::Concern::included अनुरूप है के लिए है। इस प्रकार, यदि MyModuleB को क्लास तक पहुंच की आवश्यकता है, तो इसे मिश्रित किया जा रहा है, तो आप इसे included ब्लॉक में चलाना चाहते हैं। अन्यथा, यह प्रभावी रूप से एक ही बात है।

प्रदर्शन के माध्यम से:

module A 
    def self.included(other) 
    other.send :include, B 
    end 
end 

module B 
    def self.included(other) 
    puts "B was included on #{other.inspect}" 
    end 
end 

module C 
    include B 
end 

class Foo 
    include A 
end 

# Output: 
# B was included on C 
# B was included on Foo 
+0

धन्यवाद। मैंने एक [नया संबंधित प्रश्न] खोला (http://stackoverflow.com/questions/13110749/how-to-make-methods-added-by-the-inclusion-of-a-nested- मॉड्यूल-to-be-instance) तरीकों पर। – Backo

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