मैं रूबी में एक मॉड्यूल के उदाहरण चर की शुरुआत कैसे कर सकता हूं?


80

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

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

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

def init
  @var = 0
end

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

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


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

जवाबों:


109

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

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!"

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

# 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?"

12
कुछ समय हो गया है, लेकिन हाँ :)। साथ ही, मुझे लगता है कि मेसर्स फू और बार के बारे में जो कहा जाना चाहिए, वह सब कहा जा चुका है।
20

तो इस बिंदु पर, उदाहरण चर नहीं हैं, लेकिन उदाहरण के तरीके?
निप्पोंसे

निप्पोंसे: उदाहरण चर क्या नहीं हैं?
18

5

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

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

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

यदि आप इसे हर बार कॉल नहीं करना चाहते हैं, तो आप कुछ इस तरह से उपयोग कर सकते हैं:

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

end

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

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

2

एक कक्षा के लिए, मैं निम्नलिखित कहूंगा, क्योंकि इनिशियलाइज़ को जब भी बुलाया जाता है, तो आप कक्षा का एक नया उदाहरण बन सकते हैं।

def initialize
   @var = 0
end

से प्रैक्टिकल रूबी :

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


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

1
ओपी ने विशेष रूप से मॉड्यूल का उल्लेख किया, न कि कक्षाएं
ज़ेंसाबुरो

2

मैं एक ऐसी ही जवाब सवाल है, तो आप सेट कर सकते हैं वर्ग उदाहरण चर यह कर

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

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

ऐसा लगता है कि आलसी प्रारंभिककरण के साथ अभिगमकर्ताओं का उपयोग करना सबसे अच्छा अभ्यास है, जैसे:

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

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


4
ध्यान दें कि यह करने के लिए सेट @var की अनुमति कभी नहीं होगा nilयाfalse
इस्पात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.