2010-09-27 49 views

उत्तर

132

एक कक्षा परिवर्तनीय (@@) कक्षा और उसके सभी वंशजों के बीच साझा किया जाता है। एक वर्ग आवृत्ति चर (@) वर्ग के वंशज द्वारा साझा नहीं किया जाता है।


कक्षा चर (@@)

चलो एक वर्ग चर @@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 

कक्षा उदाहरण चर (@)

चलो कक्षा के उदाहरण के साथ एक साधारण वर्ग बनाते हैं va riable @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 के लिए accessors इनहेरिट करती है, यह @i ही वारिस नहीं करता है:

p Foo.i # => 1 
p Bar.i # => nil 

हम फू केको प्रभावित किए बिना बार के @i सेट कर सकते हैं:

Bar.i = 2 
p Foo.i # => 1 
p Bar.i # => 2 
+0

कक्षा विधियों का उपयोग कर आवृत्ति चर वापस क्यों करें? क्या आप अक्सर इस स्थिति में भाग लेते हैं? – sekmo

+0

@sekmo इन उदाहरणों में एक्सेसर्स या तो क्लास पदानुक्रम से संबंधित क्लास, या _class variables_ से संबंधित _class instance variables_ लौटाते हैं। वे सादे _instance variables_ वापस नहीं करते हैं जो कक्षा के उदाहरणों से संबंधित हैं। "इंस्टेंस वैरिएबल," "क्लास इंस्टेंस वैरिएबल," और "क्लास वैरिएबल" शब्द काफी उलझन में हैं, है ना? –

59

सबसे पहले आप यह समझना चाहिए कि कक्षाओं उदाहरणों भी कर रहे हैं - 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 के उपयोग की सिफारिश करने के लिए कहते हैं।

+0

+1 कक्षाओं के उदाहरण हैं कि कक्षाएं 'कक्षा' – mikezter

+1

+1 सुपर स्पष्टीकरण के उदाहरण हैं! यह ऐसा कुछ है जो रूबी के लिए नया प्रोग्रामर पचाना चाहिए। – TomZ

संबंधित मुद्दे