कक्षा के बाहर से पहुँच आवृत्ति चर


82

यदि कोई इंस्टेंस वैरिएबल किसी वर्ग का है, तो क्या मैं इंस्टैंस वैरिएबल (उदाहरण @hello) को सीधे क्लास इंस्टैंस का उपयोग कर सकता हूं ?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1

जवाबों:


148

हां, आप instance_variable_getइस तरह का उपयोग कर सकते हैं :

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
p h.instance_variable_get(:@hello) #nil
p h.method1                        #"pavan" - initialization of @hello
p h.instance_variable_get(:@hello) #"pavan"

यदि चर अपरिभाषित है ( instance_variable_getमेरे उदाहरण में पहला कॉल ) आपको मिलता है nil


जैसा कि एंड्रयू ने अपनी टिप्पणी में उल्लेख किया है:

जैसे ही यह एनकैप्सुलेशन का उल्लंघन करता है, आपको इसे डिफ़ॉल्ट चर का उपयोग नहीं करना चाहिए।

बेहतर तरीका यह है कि एक एक्सेसर को परिभाषित करें:

class Hello
  def method1
    @hello = "pavan"
  end
  attr_reader :hello  
end

h = Hello.new
p h.hello #nil
p h.method1                        #"pavan" - initialization of @hello
p h.hello #"pavan"

आप किसी अन्य विधि नाम चाहते हैं, आप हो सकता है उर्फ एक्सेसर: alias :my_hello :hello

और अगर आपके कोड में वर्ग को परिभाषित नहीं किया गया है, लेकिन एक मणि में: आप अपने कोड में कक्षाओं को संशोधित कर सकते हैं और कक्षाओं में नए कार्य सम्मिलित कर सकते हैं


6
जैसे ही यह एनकैप्सुलेशन का उल्लंघन करता है, आपको इसे डिफ़ॉल्ट चर का उपयोग नहीं करना चाहिए ।
एंड्रयू मार्शल

@knut हम सिर्फ तरह ऐसा नहीं कर सकते h = Hello.newऔर h.method1और h.hello?
nik7

3
@nlingutla आप के साथ एक्सेसर परिभाषित कर सकते हैंattr_reader :hello
नूट

यह नहीं होगा alias my_hello hello, नहीं alias :my_hello :hello?
निधि मोनिका का मुकदमा

1
मेरे लिए, यह चश्मा के लिए बहुत अच्छा है, जहाँ आप कुछ सार्वजनिक नहीं करना चाहते हैं।
baash05

20

आप इसे कॉल करके attr_readerया attr_accessorइस तरह से भी पूरा कर सकते हैं :

class Hello
  attr_reader :hello

  def initialize
    @hello = "pavan"
  end
end

या

class Hello
  attr_accessor :hello

  def initialize
    @hello = "pavan"
  end
end

कॉलिंग दिए गए वैरिएबल के लिए attr_readerबनाएगी getter:

h = Hello.new
p h.hello        #"pavan"

कॉलिंग attr_accessorएक getterऔर setterदिए गए वैरिएबल के लिए बनाएगी :

h = Hello.new
p h.hello        #"pavan"
h.hello = "John"
p h.hello        #"John"

जैसा कि आप समझ सकते हैं, उपयोग करें attr_readerऔर attr_accessorतदनुसार। तभी इसका उपयोग attr_accessorजब आप की जरूरत है एक getterऔर एक setterऔर उपयोग attr_readerजब आप केवल एक की जरूरत हैgetter

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