2014-05-02 4 views
5

Nach wikibooks ...Unterschied zwischen der Instanzvariable "@", die zum Klassenobjekt gehört, und der Klassenvariablen "@@" in Ruby?

  • @one unter ist eine Instanzvariable auf das Klassenobjekt gehör (beachten Sie dies nicht das gleiche wie eine Klassenvariable und nicht als @@one bezeichnet werden könnte)
  • @@value ist eine Klassenvariable (ähnlich wie in Java oder C++ statisch).
  • @twoist eine Instanzvariable gehört Instanzen von MyClass.

Meine Fragen:

Was ist der Unterschied zwischen @One und @@ Wert?
Gibt es auch einen Grund, @one überhaupt zu verwenden?

class MyClass 
    @one = 1 
    @@value = 1 

    def initialize() 
    @two = 2 
    end 
end 

Antwort

5

@one ist eine Instanz der Klasse variable MyClass und @@value ist die Klassenvariable MyClass. Als @one eine Instanzvariable ist es nur von der Klasse MyClass gehört (In Ruby-Klasse ist auch das Objekt), nicht gemeinsam nutzbare, aber @@value ist ein Variable geteilt.

gemeinsam benutzte Variable

class A 
    @@var = 12 
end 

class B < A 
    def self.meth 
    @@var 
    end 
end 

B.meth # => 12 

nicht gemeinsam benutzte Variable

class A 
    @var = 12 
end 

class B < A 
    def self.meth 
    @var 
    end 
end 

B.meth # => nil 

@twoMyClass eine Instanzvariable der Instanzen der Klasse ist.

Instanzvariablen sind private Eigenschaften von Objekten, daher würden sie diese nicht teilen. In Ruby-Klassen sind auch Objekte. @one Sie innerhalb einer Klasse definiert MyClass, so ist es nur im Besitz der Klasse, die es definiert. Auf der anderen Seite @two Instanzvariable wird erstellt, wenn Sie ein Objekt der Klasse MyClass, z. B. ob erstellen, mit MyClass.new. @two ist nur im Besitz von ob, keine anderen Objekte haben eine Ahnung davon.

+1

Wie unterscheidet sich '@ one' von' @ two'?Ich verstehe, dass @zwei zu Instanzen von MyClass gehört, aber ich verstehe nicht, wie eine Instanzvariable nur zum Klassenobjekt gehören kann, nicht aber zu Instanzen einer Klasse. – ayjay

+0

@ayjay Ist es jetzt klar? –

+0

ja. Danke für die Erklärung! – ayjay

0

Die Art, wie ich darüber nachdenke ist, wer die Information halten sollte oder eine Aufgabe erledigen kann (weil das für Klassenmethoden und Instanzmethoden dasselbe ist).

class Person 
    @@people = [] 

    def initialize(name) 
    @name = name 
    @@people << self 
    end 

    def say_hello 
    puts "hello, I am #{@name}" 
    end 
end 

# Class variables and methods are things that the collection should know/do 
bob = Person.new("Bob") # like creating a person 
Person.class_variable_get(:@@people) # or getting a list of all the people initialized 

# It doesn't make sense to as bob for a list of people or to create a new person 
# but it makes sense to ask bob for his name or say hello 
bob.instance_variable_get(:@name) 
bob.say_hello 

Ich hoffe, dass hilft.

Verwandte Themen