2015-01-18 4 views
15

एक मॉड्यूल MyModule है:रूबी मॉड्यूल - शामिल अंत ब्लॉक करना

module MyModule 

    extend ActiveSupport::Concern 

    def first_method 
    end 

    def second_method 
    end 

    included do 
    second_class_method 
    end 

    module ClassMethods 
    def first_class_method 
    end 

    def second_class_method 
    end 
    end 
end 

कुछ वर्ग include रों इस मॉड्यूल, यह 2 तरीकों उदाहरण विधियों (first_method और second_method) और 2 वर्ग तरीके के रूप में सामने आ रहा होगा जब (first_class_method और second_class_method) - यह स्पष्ट है।

यह कहा जाता है, कि

included ब्लॉक वर्ग कि मॉड्यूल भी शामिल है के संदर्भ में निष्पादित किया जाएगा।

इसका क्या अर्थ है? मतलब, जब यह विधि वास्तव में होगी (second_class_method) निष्पादित किया जाएगा?

उत्तर

38

यहाँ एक व्यावहारिक उदाहरण है।

class MyClass 
    include MyModule 
end 

जब आप एक कक्षा में मॉड्यूल शामिल होंगे, included हुक बुलाया जाएगा। इसलिए, second_class_method को Class के दायरे में बुलाया जाएगा।

यहाँ क्या होता है

  1. first_method और second_methodMyClass.

    instance = MyClass.new 
    instance.first_method 
    # => whatever returned value of first_method is 
    
  2. के कहने-तरीकों ClassMethods के तरीकों स्वचालित रूप से MyClass के वर्ग तरीके के रूप में मिलाया जाता है के रूप में शामिल कर रहे हैं। यह एक आम रूबी पैटर्न है, ActiveSupport::Concern encapsulates। गैर रूबी कोड

    module MyModule 
        def self.included(base) 
        base.extend ClassMethods 
        end 
    
        module ClassMethods 
        def this_is_a_class_method 
        end 
        end 
    end 
    

    कौन सा

    MyClass.this_is_a_class_method 
    

    में या अपने मामले

    MyClass.first_class_method 
    
  3. included में जो परिणाम एक हुक निम्नलिखित कोड

    को प्रभावी ढंग से है है
    # non-Rails version 
    module MyModule 
        def self.included(base) 
        base.class_eval do 
         # somecode 
        end 
        end 
    end 
    
    # Rails version with ActiveSupport::Concerns 
    module MyModule 
        included do 
        # somecode 
        end 
    end 
    

    यह आम पैटर्न के लिए ज्यादातर "सिंटेक्टिक चीनी" है। अभ्यास में क्या होता है, यह है कि जब आप मॉड्यूल को मिलाते हैं, तो उस कोड को मिक्सर क्लास के संदर्भ में निष्पादित किया जाता है।

+1

सब कुछ तर्क लगता है, लेकिन फिर भी .. उदाहरण के लिए देखते हैं। क्या होगा यदि 'second_class_method' 'raise' के रूप में लागू किया गया है, जब मैं उठाया गया हूं?", यह कब उठाया जाएगा? –

+3

जैसे ही समवर्ती आपके मॉड्यूल को शामिल करेगा, इसे लगभग तुरंत उठाया जाएगा। यह वास्तव में रूबी कोड पार्सिंग प्रक्रिया का कारण बन जाएगा और दुभाषिया को तुरंत दुर्घटनाग्रस्त कर देगा। आप इसे स्वयं आज़मा सकते हैं। –

7

included जब आप एक वर्ग में module शामिल कहा जाता है, यह परिभाषित करने संबंधों, स्कोप, सत्यापन के लिए प्रयोग किया जाता है, ... इससे पहले कि आप भी उस वर्ग से वस्तु बनाया है यह कहा जाता हो जाता है।

उदाहरण

module M 
... 
    included do 
    validates :attr, presence: true 
    has_many :groups 
    end 
... 
end 
+0

इसलिए सत्यापन होने पर मॉड्यूल को शामिल किया जा सकता है पर प्रतिबंध बनाते हैं? – stackjlei

+0

यदि आप ब्लॉक ब्लॉक के बाहर स्कॉप्स सेट करते हैं तो यह क्यों काम नहीं करेगा? यह अभी भी कक्षा के संदर्भ में स्थापित किया जाएगा जिसमें मॉड्यूल शामिल है, है ना? – stackjlei

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