2012-10-18 22 views
9

मैं रूबी 3.2.2 पर रूबी का उपयोग कर रहा हूं। मैं RoR ActiveSupport::Concern सुविधा का उपयोग करके एक मॉड्यूल को कार्यान्वित कर रहा हूं और इसमें अपनी कक्षा में शामिल हूं। यह included do ... end ब्लॉक बनाने के कोड को उस कक्षा के कक्षा संदर्भ में निष्पादित करने के लिए उपलब्ध कराया गया है जहां मॉड्यूल शामिल है।मुझे 'शामिल डू ... एंड' ब्लॉक में क्या शामिल नहीं करना चाहिए?

मेरा संदेह है: मुझे included do ... end ब्लॉक में शामिल होना चाहिए? उदाहरण के लिए, क्या यह निम्नलिखित बनाने के लिए "सामान्य"/"अच्छा" अभ्यास है?

module MyModule 
    extend ActiveSupport::Concern 

    class MyModuleClass 
    attr_accessor :attr1, :attr2, :attr3 

    def initialize(attrs) 
    @attr1 = attrs[:attr1] 
    @attr2 = attrs[:attr2] 
    @attr3 = attrs[:attr3] 
    end 
    end 

    included do 
    @my_module_class = MyModuleClass.new(some_attrs) 
    end 
end 

अधिक, @my_module_class चर MyModule (BTW के वर्ग सहित इसमें विशेषता के रूप में उपलब्ध हो जाएगा: मैं के बाद से MyModule को @my_module_class "दिखाई" होने के लिए करना चाहते हैं केवल आंतरिक इसका उद्देश्य केवल उस मॉड्यूल में उपयोग किया जाना है)? क्या कुछ ऐसे "उन्नत" उदाहरण हैं या इस तरह की स्थितियों को संभालने के तरीकों पर ट्यूटोरियल हैं कि मैं उपरोक्त कोड के included do ... end ब्लॉक में तत्काल प्रयास करने की कोशिश कर रहा हूं? आप किस बारे में सलाह देते हैं?

उत्तर

2

@my_class MyClass का एक उदाहरण होगा और MyModule नहीं होगा। यदि आप MyClass के सभी उदाहरणों को MyModule का उदाहरण बनाना चाहते हैं तो आपको लिखना चाहिए:

include MyModule 

कक्षा परिभाषा के अंदर।

मुझे लगता है कि अगर आप संपादित किए जाने से पहले इस प्रश्न के मूल संस्करण को देखते हैं तो मेरा उत्तर समझ में आता है।

संपादित करें 1:

के अपने उदाहरण के लिए पर जोड़ें और कहते हैं कि तुम एक वर्ग फू कहा जाता है:

class Foo 
    include MyModule 
end 

आपको लगता है कि फू लेकिन यह साथ जुड़ा हुआ है MyModuleClass का एक उदाहरण बनाना चाहते ऐसा लगता है कि आप वास्तव में फू को संशोधित नहीं करना चाहते हैं या इसे MyModuleClass तक पहुंच प्रदान नहीं करना चाहते हैं। मेरा प्रस्ताव है कि आप एक हैश तालिका का उपयोग करें:

module MyModule 
    # ... 

    @hash = {} 
    class << self 
     attr_accessor :hash 
    end 

    included do 
     MyModule.hash[self] = MyModuleClass.new(some_attrs) 
    end 
end 

मुझे लगता है कि काम करेंगे, और यह Foo वर्ग वस्तु के लिए करने के लिए एक उदाहरण चर जोड़ने टाल। तकनीकी रूप से, रूबी कोड का कोई भी हिस्सा MyModule.hash तक पहुंच सकता है लेकिन आपको स्रोत कोड में टिप्पणी करना चाहिए कि लोगों को ऐसा न करने दें, और विज्ञापन न दें कि हैश मौजूद है।

+0

धन्यवाद, लेकिन "मुख्य" प्रश्न "क्या करना चाहिए * अंत * ब्लॉक में शामिल नहीं होना चाहिए?" संबंधित, * उदाहरण के लिए *, मेरे मामले में। बाकी एक "अधिक" है, भले ही यह मेरे लिए बहुत महत्वपूर्ण है। हालांकि, मैं * MyModuleClass' के सभी उदाहरणों को 'MyModule' का उदाहरण नहीं बनाना चाहता हूं, बल्कि उन लोगों को केवल आंतरिक रूप से' MyModule 'पर उपलब्ध कराने के लिए करना चाहता हूं; इसके अलावा, कक्षा परिभाषा के अंदर 'MyModule' कथन शामिल है अंतर्निहित/स्पष्ट है, क्योंकि मॉड्यूल को कक्षा में शामिल करने का इरादा है। – user12882

+0

"मुझे क्या नहीं करना चाहिए" का सवाल वास्तव में उत्तर देने के लिए बहुत अस्पष्ट है, लेकिन कृपया ऊपर "मेरा संपादित करें" देखें, जहां मैं आप जिस समस्या के बारे में पूछ रहा हूं उसे हल करने का प्रयास करता हूं। –