17

मैं ActiveSupport::Concern प्यार करता हूँ।InstanceMethods मॉड्यूल को बहिष्कृत क्यों किया गया है?

यह आसान एक अच्छा वाक्य रचना के साथ अपनी कक्षाओं में कार्यक्षमता जोड़ने के, बनाता है।

फिर भी, रेल 3.2 में, InstanceMethods मॉड्यूल मान्य नहीं है।

# edit: don't do this! The method definition should just be in the body of the module 
included do 
    def my_method; end 
end 

मैं सिर्फ किसी को भी जानता है क्यों वे ऐसा करने का फैसला किया सोच रहा था: अगर मैं सही ढंग से समझ, हम सिर्फ included ब्लॉक (वास्तव में यह सिर्फ मॉड्यूल के मुख्य भाग में है) में हमारे तरीकों परिभाषित करना चाहिए? उदाहरण को

उत्तर

26

आइए नज़र आप पहली बार जुड़े।

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    module InstanceMethods 
    def tags() 
     # ... 
    end 
    end 
end 

जब आप अपने वर्ग में taglib शामिल के रूप में चिंता स्वचालित रूप से ClassMethods मॉड्यूल के साथ वर्ग प्रदान करता है और InstanceMethods मॉड्यूल भी शामिल है।

class Foo 
    include TagLib 
    # is roughly the same as 
    include TagLib::InstanceMethods 
    extend TagLib::ClassMethods 
end 

लेकिन आप हम पहले से ही taglib मॉड्यूल में ही शामिल कर रहे हैं, इसलिए पद्धतियां यह भीतर परिभाषित वर्ग पर उदाहरण के तरीके के रूप में पहले से ही उपलब्ध हैं देखा हो सकता है। फिर आप एक अलग InstanceMethods मॉड्यूल क्यों चाहते हैं?

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    def tags() 
    # ... 
    end 
end 

class Foo 
    include TagLib 
    # does only `extend TagLib::ClassMethods` for you 
end 
+0

ठीक है, यह समझ में आता है। लेकिन अब मैं क्यों वे पहली जगह तो इस चुनाव किया सोच रहा हूँ ... वहाँ तरह वे InstanceMethods मॉड्यूल शामिल है और कैसे सामान्य उदाहरण मॉड्यूल के तरीके शामिल किए गए हैं जब मैं सिर्फ 'TagLib' शामिल करते हैं के बीच कोई मतभेद नहीं है? – Robin

+0

क्या यह सिर्फ स्थिरता के लिए था? – Robin

+0

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन मुझे लगता है कि यह सिर्फ यह एहसास के लिए कुछ समय ले लिया। –