यदि कोई इंस्टेंस वैरिएबल किसी वर्ग का है, तो क्या मैं इंस्टैंस वैरिएबल (उदाहरण @hello
) को सीधे क्लास इंस्टैंस का उपयोग कर सकता हूं ?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
जवाबों:
हां, आप 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
।
और अगर आपके कोड में वर्ग को परिभाषित नहीं किया गया है, लेकिन एक मणि में: आप अपने कोड में कक्षाओं को संशोधित कर सकते हैं और कक्षाओं में नए कार्य सम्मिलित कर सकते हैं ।
h = Hello.new
और h.method1
और h.hello
?
attr_reader :hello
alias my_hello hello
, नहीं alias :my_hello :hello
?
आप इसे कॉल करके 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