2009-03-30 2 views
72

मैं जहाँ मैं में उदाहरण चर का उपयोग करना चाहते हैं कुछ मॉड्यूल है:।रूबी में मॉड्यूल के आवृत्ति चर को कैसे शुरू किया जा सकता है? मैं वर्तमान में इस तरह से उन्हें आरंभ कर रहा हूँ

module MyModule 
    def self.method_a(param) 
    @var ||= 0 
    # other logic goes here 
    end 
end 

मैं भी एक init विधि उन्हें प्रारंभ करने में कह सकते हैं:

def init 
    @var = 0 
end 

लेकिन इसका मतलब यह होगा कि मुझे हमेशा इसे कॉल करना याद रखना होगा।

क्या ऐसा करने का कोई बेहतर तरीका है?

+3

पहला कोड ब्लॉक मॉड्यूल-आवृत्ति var (MyModule के प्रकार ऑब्जेक्ट के दायरे में एक var) सेट नहीं करता है, जबकि दूसरा "सादा" उदाहरण var सेट करता है (एक उदाहरण के दायरे में एक var जिसमें शामिल है मॉड्यूल)? मुझे लगता है कि ये दो कोड ब्लॉक एक ही काम नहीं करते हैं ... –

उत्तर

98

उन्हें मॉड्यूल परिभाषा प्रमाणित करें।

module MyModule 
    # self here is MyModule 
    @species = "frog" 
    @color = "red polka-dotted" 
    @log = [] 

    def self.log(msg) 
    # self here is still MyModule, so the instance variables are still available 
    @log << msg 
    end 
    def self.show_log 
    puts @log.map { |m| "A #@color #@species says #{m.inspect}" } 
    end 
end 

MyModule.log "I like cheese." 
MyModule.log "There's no mop!" 
MyModule.show_log #=> A red polka-dotted frog says "I like cheese." 
        # A red polka-dotted frog says "There's no mop!" 

मॉड्यूल परिभाषित होने पर यह आवृत्ति चर सेट करेगा। याद रखें, आप alwasys बाद में, और उदाहरण चर और विधि परिभाषाओं को जोड़ने के लिए या मौजूदा को फिर से परिभाषित करने के लिए मॉड्यूल फिर से खोलना कर सकते हैं:

# continued from above... 
module MyModule 
    @verb = "shouts" 
    def self.show_log 
    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" } 
    end 
end 
MyModule.log "What's going on?" 
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese." 
        # A red polka-dotted frog shouts "There's no mop!" 
        # A red polka-dotted frog shouts "What's going on?" 
+17

कोई भी poignant गाइड पढ़ रहा है;) –

+12

यह थोड़ी देर हो गया है, लेकिन हाँ :)। इसके अलावा, मुझे लगता है कि मेसर्स फू और बार के बारे में जो कुछ कहा जाना चाहिए, उसे कहा गया है। – rampion

+0

आपके उत्तर के लिए धन्यवाद। – Geo

6

आप उपयोग कर सकते हैं:

def init(var=0) 
@var = var 
end 

और यह 0 के लिए डिफ़ॉल्ट आप कुछ भी उत्तीर्ण नहीं होते हैं, तो होगा। एक वर्ग के लिए

module AppConfiguration 
    mattr_accessor :google_api_key 
    self.google_api_key = "123456789" 
... 

end 
+0

तो, मॉड्यूल के साथ कुछ भी करने से पहले मुझे अभी भी इस फ़ंक्शन को कॉल करने की आवश्यकता है? – Geo

+0

मैंने उस समस्या से बचने के लिए दूसरा तरीका जोड़ा - रेल कोड से – Brian

2

, मैं निम्नलिखित कहेंगे, क्योंकि इनिशियलाइज़ जब भी आप कहा जाता है:

आप इसे हर फोन करने के लिए नहीं करना चाहते हैं, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं। कक्षा का एक नया उदाहरण नया।

def initialize 
    @var = 0 
end 
Practical Ruby से

:

यह पर चला जाता है यह कहना है कि एक मॉड्यूल के इनिशियलाइज़ अगर वर्ग के इनिशियलाइज़ सहित एक सुपर कॉल बुलाया जाएगा, लेकिन वह इस परिणाम है का उल्लेख नहीं करता हर जगह कितनी सुपर काम करता है, प्रारंभ करने के लिए विशेष हैंडलिंग नहीं है। (एक क्यों मान सकता इनिशियलाइज़ विशेष हैंडलिंग हो जाता है? क्योंकि यह दृश्यता को सम्मान के साथ विशेष हैंडलिंग हो जाता है। विशेष मामलों भ्रम पैदा करते हैं।)

+1

इसके मॉड्यूल के बाद से, प्रारंभिक रूप से कॉल किया जाएगा? यही मेरा पहला जवाब था। मैंने इसे दूसरे खाते में नहीं जोड़ा क्योंकि इसे बुलाया नहीं जा रहा है। – Brian

+1

ओपी ने विशेष रूप से मॉड्यूल का उल्लेख किया है, कक्षा – Zensaburou

1

मैं एक ऐसी ही question उत्तर दिया, आपवर्ग उदाहरण चर सेट कर सकते हैं इस

कर
module MyModule 
    class << self; attr_accessor :var; end 
end 

MyModule.var 
=> nil 

MyModule.var = 'this is saved at @var' 
=> "this is saved at @var" 

MyModule.var  
=> "this is saved at @var" 
2

जाहिर है रूबी में मॉड्यूल में इंस्टेंस चर शुरू करने के लिए यह खराब रूप है। (कारणों के लिए मैं पूरी तरह से समझ नहीं है, लेकिन जिस क्रम में बातें कर रहे हैं instantiated से संबंधित।)

ऐसा लगता है कि सबसे अच्छा अभ्यास तो जैसे आलसी initialisation साथ accessors उपयोग करने के लिए, है: तो फिर

module MyModule 
    def var 
    @var ||= 0 
    end 
end 

@var के लिए गेटर के रूप में var का उपयोग करें।

+3

ध्यान दें कि यह आपको @var से 'nil' या 'false' सेट करने की अनुमति नहीं देगा – steel

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

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