जवाबों:
एक वर्ग चर ( @@
) वर्ग और उसके सभी वंशों के बीच साझा किया जाता है। एक वर्ग उदाहरण चर ( @
) वर्ग के वंशजों द्वारा साझा नहीं किया जाता है।
कक्षा चर ( @@
)
चलो एक वर्ग के साथ एक वर्ग फू है @@i
, और पढ़ने और लिखने के लिए accessors @@i
:
class Foo
@@i = 1
def self.i
@@i
end
def self.i=(value)
@@i = value
end
end
और एक व्युत्पन्न वर्ग:
class Bar < Foo
end
हम देखते हैं कि फू और बार के लिए समान मूल्य है @@i
:
p Foo.i # => 1
p Bar.i # => 1
और @@i
एक में बदलने से दोनों में परिवर्तन होता है:
Bar.i = 2
p Foo.i # => 2
p Bar.i # => 2
वर्ग उदाहरण चर ( @
)
@i
पढ़ने और लिखने के लिए एक वर्ग उदाहरण चर और अभिगमकर्ताओं के साथ एक साधारण वर्ग बनाते हैं @i
:
class Foo
@i = 1
def self.i
@i
end
def self.i=(value)
@i = value
end
end
और एक व्युत्पन्न वर्ग:
class Bar < Foo
end
हम देखते हैं कि यद्यपि बार के लिए अभिगमकर्ता को विरासत में मिला है @i
, यह @i
स्वयं को विरासत में नहीं मिला है:
p Foo.i # => 1
p Bar.i # => nil
हम @i
फू को प्रभावित किए बिना बार को सेट कर सकते हैं @i
:
Bar.i = 2
p Foo.i # => 1
p Bar.i # => 2
सबसे पहले आपको समझना चाहिए कि कक्षाएं भी उदाहरण हैं - उदाहरण Class
वर्ग के ।
एक बार जब आप समझ जाते हैं, तो आप समझ सकते हैं कि एक वर्ग के पास इसके साथ जुड़े उदाहरण चर हो सकते हैं जैसे कि एक नियमित (पढ़ा हुआ: गैर-वर्ग) ऑब्जेक्ट।
Hello = Class.new
# setting an instance variable on the Hello class
Hello.instance_variable_set(:@var, "good morning!")
# getting an instance variable on the Hello class
Hello.instance_variable_get(:@var) #=> "good morning!"
ध्यान दें कि एक उदाहरण चर पर Hello
पूरी तरह से असंबंधित है और एक उदाहरण चर पर एक उदाहरण से अलग हैHello
hello = Hello.new
# setting an instance variable on an instance of Hello
hello.instance_variable_set(:@var, :"bad evening!")
# getting an instance variable on an instance of Hello
hello.instance_variable_get(:@var) #=> "bad evening!")
# see that it's distinct from @var on Hello
Hello.instance_variable_get(:@var) #=> "good morning!"
दूसरी ओर एक वर्ग चर उपरोक्त दो का एक प्रकार है, क्योंकि यह Hello
स्वयं और इसके उदाहरणों के साथ-साथ उपवर्गों Hello
और उनके उदाहरणों पर भी सुलभ है :
HelloChild = Class.new(Hello)
Hello.class_variable_set(:@@class_var, "strange day!")
hello = Hello.new
hello_child = HelloChild.new
Hello.class_variable_get(:@@class_var) #=> "strange day!"
HelloChild.class_variable_get(:@@class_var) #=> "strange day!"
hello.singleton_class.class_variable_get(:@@class_var) #=> "strange day!"
hello_child.singleton_class.class_variable_get(:@@class_Var) #=> "strange day!"
कई लोग class variables
ऊपर के अजीब व्यवहार के कारण बचने के लिए कहते हैं , और class instance variables
इसके बजाय इसके उपयोग की सलाह देते हैं ।
इसके अलावा, मैं यह जोड़ना चाहता हूं कि आप कक्षा के @@
किसी भी उदाहरण से वर्ग चर ( ) तक पहुंच प्राप्त कर सकते हैं
class Foo
def set_name
@@name = 'Nik'
end
def get_name
@@name
end
end
a = Foo.new
a.set_name
p a.get_name # => Nik
b = Foo.new
p b.get_name # => Nik
लेकिन आप वर्ग उदाहरण चर ( @
) के लिए भी ऐसा नहीं कर सकते
class Foo
def set_name
@name = 'Nik'
end
def get_name
@name
end
end
a = Foo.new
a.set_name
p a.get_name # => Nik
b = Foo.new
p b.get_name # => nil
Foo.i
, लेकिन आप इस वर्ग के हर उदाहरण के लिए ऐसा कैसे कर सकते हैं Foo.new.i
?
#class
। मुझे व्यक्तिगत रूप से लगता है कि #class
जब किसी भी चीज़ पर कॉल किया जाता है, लेकिन self
कोड की गंध होती है। तुम भी एक कदम आगे जाने के लिए और उदाहरण accessors लागू कर सकते हैं i
और i=
उनके लिए है कि प्रतिनिधि #class
समकक्ष, जिस स्थिति में आप क्या कर सकते हैं Foo.new.i
। मैं ऐसा करने की अनुशंसा नहीं करता क्योंकि यह एक भ्रमित इंटरफ़ेस बनाता है, यह सुझाव देता है कि आप एक वस्तु सदस्य को संशोधित कर रहे हैं।