रूबी में मॉड्यूल चर बनाएं


111

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

जवाबों:


158

रूबी मूल रूप से मॉड्यूल में वर्ग चर का समर्थन करती है, इसलिए आप सीधे वर्ग चर का उपयोग कर सकते हैं, न कि कुछ प्रॉक्सी या छद्म-वर्ग-चर:

module Site
  @@name = "StackOverflow"

  def self.setName(value)
    @@name = value
  end

  def self.name
    @@name
  end
end

Site.name            # => "StackOverflow"
Site.setName("Test")
Site.name            # => "Test"

5
+1 वास्तव में, मैं सोच रहा था कि 'वर्ग चर' शब्द भ्रामक है। कक्षाएं मॉड्यूल के विशेष मामले हैं, और वर्ग चर मॉड्यूल पर निश्चित हैं। उन्हें मॉड्यूल चर कहा जाना चाहिए।
आरा १

3
@ सावा: यह कुछ भ्रामक है, लेकिन यह वही है जो रूबी खुद इस्तेमाल करती है defined?(@@foo) => "class variable":।
एंड्रयू ग्रिम

1
या उन्हें स्थैतिक क्षेत्र कहा जा सकता है। लगता है कि वे क्या हैं।
पीटर अज़ताई

@ द्वारपाल अरे मेरी गलती। दो '@@' वर्ग चर की आवश्यकता क्यों है? क्या यह एक कोड गंध नहीं माना जाता है, खासकर यदि वर्ग चर का उपयोग करने के लिए वर्ग बढ़ाया जाता है? मैं यह परीक्षण कर रहा था और मुझे एहसास हुआ कि मैं एकल @उदाहरण चर से एक ही परिणाम प्राप्त कर सकता हूं । क्या वर्ग चर का उपयोग करने का कोई विशेष कारण है? उत्तर के लिए धन्यवाद।
fabbb

2
आखिर में अलग-अलग कॉल क्यों: T.getऔर T::get?
10

31

यदि आपको इसे एक उदाहरण के भीतर से कॉल करने की आवश्यकता नहीं है, तो आप बस मॉड्यूल बॉडी के भीतर एक इंस्टेंस चर का उपयोग कर सकते हैं।

module SomeModule
  module_function
  def param; @param end
  def param= v; @param = v end
end

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1

उदाहरण चर @paramतब मॉड्यूल से संबंधित होगा SomeModule, जो Moduleवर्ग का एक उदाहरण है ।


23

आप मॉड्यूल में एक वर्ग उदाहरण चर सेट कर सकते हैं।

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

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

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

+1, लेकिन मैं सिर्फ इस बात पर जोर दूंगा कि वर्ग उदाहरण चर वर्ग चर के लिए अलग हैं।
एंड्रयू ग्रिम

4
हाँ पूरी तरह से .. और btw .. मैं जब आप उन्हें प्रयोग होता .. कुछ अप्रत्याशित चीजें बिल्कुल वर्ग चर उपयोग करने की अनुशंसा न .. इस लेख को देखने के लिए कुछ उदाहरण देखने के oreillynet.com/ruby/blog/2007/01/...
ऑरलैंडो

8

आप मॉड्यूल परिभाषा के भीतर मूल्य को इनिशियलाइज़ भी कर सकते हैं:

module MyModule
  class << self
    attr_accessor :my_variable
  end
  self.my_variable = 2 + 2
end

p MyModule.my_variable
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.