94 votes

Différence entre les variables de classe et classe les variables d'instance?

Quelqu'un peut me dire à propos de la différence entre les variables de classe et classe les variables d'instance?

157voto

Wayne Conrad Points 31052

Une variable de classe (@@) est partagé entre la classe et l'ensemble de ses descendants. Une variable d'instance de classe (@) n'est pas partagée par la classe de descendants.


Variable de classe (@@)

Nous allons avoir une classe Foo avec une variable de classe @@i, et les accesseurs en lecture et en écriture @@i:

class Foo

  @@i = 1

  def self.i
    @@i
  end

  def self.i=(value)
    @@i = value
  end

end

Et une classe dérivée:

class Bar < Foo
end

Nous voyons que Foo et Bar ont la même valeur de @@i:

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

Et en changeant @@je dans on la change, à la fois:

Bar.i = 2
p Foo.i    # => 2
p Bar.i    # => 2

Variable d'instance de classe (@)

Nous allons faire une simple classe avec une classe de variable d'instance @i et accesseurs en lecture et en écriture @i:

class Foo

  @i = 1

  def self.i
    @i
  end

  def self.i=(value)
    @i = value
  end

end

Et une classe dérivée:

class Bar < Foo
end

Nous voyons que, bien que la Barre hérite des accesseurs pour @i, il n'hérite pas @i lui-même:

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

Nous pouvons mettre en du Bar @i sans affecter Foo @i:

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

73voto

banister Points 13181

D'abord, vous devez comprendre que les classes sont des instances trop -- les instances de l' Class classe.

Une fois que vous comprenez cela, vous pouvez comprendre qu'une classe peut avoir des variables d'instance associé juste en tant que régulier (lire: non-classe) objet peut.

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!"

Notez qu'une variable d'instance sur Hello est complètement indépendants et distincts à partir d'une variable d'instance sur une instance de 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!"

Une variable de classe sur l'autre main est une sorte de combinaison des deux ci-dessus, accessible sur Hello lui-même et à ses instances, ainsi que sur les sous-classes de Hello et leurs instances:

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!"

Beaucoup de gens disent pour éviter class variables en raison de l'étrange comportement ci-dessus, et de recommander l'utilisation d' class instance variables à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X