206 votes

Ruby variable d'instance de classe contre classe variable

J'ai lu ce thread Quand dois-Ruby variables d'instance préparez-vous? mais je suis à deux doigts lors de l'utilisation de la classe des variables d'instance.
Variables de classe sont partagées par tous les objets d'une classe, les variables d'Instance appartiennent à un objet... Pas beaucoup de place à gauche pour utiliser la classe de variables d'instance, si nous avons des variables de classe...
Pourriez-vous m'expliquer la différence entre ces deux et quand les utiliser? exemple de code:

class S
  @@k = 23
  @s = 15
  def self.s
    @s
  end
  def self.k
     @@k
  end

end
p S.s #15
p S.k #23

Mise à jour
Je comprends maintenant, Classe les Variables d'Instance sont enregistrer d'être transmis à l'héritage de la chaîne! Merci à tous!

313voto

Phrogz Points 112337

Variable d'Instance d'une classe:

class Parent
  @things = []
  def self.things
    @things
  end
  def things
    self.class.things
  end
end

class Child < Parent
  @things = []
end

Parent.things << :car
Child.things  << :doll
mom = Parent.new
dad = Parent.new

p Parent.things #=> [:car]
p Child.things  #=> [:doll]
p mom.things    #=> [:car]
p dad.things    #=> [:car]

Variable de classe:

class Parent
  @@things = []
  def self.things
    @@things
  end
  def things
    @@things
  end
end

class Child < Parent
end

Parent.things << :car
Child.things  << :doll

p Parent.things #=> [:car,:doll]
p Child.things  #=> [:car,:doll]

mom = Parent.new
dad = Parent.new
son1 = Child.new
son2 = Child.new
daughter = Child.new

[ mom, dad, son1, son2, daughter ].each{ |person| p person.things }
#=> [:car, :doll]
#=> [:car, :doll]
#=> [:car, :doll]
#=> [:car, :doll]
#=> [:car, :doll]

Avec une variable d'instance d'une classe (pas sur une instance de cette classe) vous pouvez stocker quelque chose de commun à la classe, sans avoir les sous-classes automatiquement aussi les obtenir (et vice-versa). Avec les variables de classe, vous avez la commodité de ne pas avoir à écrire self.class à partir d'une instance de l'objet, et (lorsque cela est souhaitable), vous obtenez également le partage automatique tout au long de la hiérarchie de classe.

38voto

Sachin Saxena Points 41

#variable d'instance de classe sont disponibles uniquement à la méthode de la classe et de ne pas les méthodes d'instance alors que variable de classe sont disponibles à la fois les méthodes d'instance et les méthodes de la classe. Aussi la classe des variables d'instance sont perdus dans l'héritage de la chaîne alors que les variables de classe ne le sont pas.

class Vars

@class_ins_var = "class instance variable value"    #class instance variable
@@class_var = "class variable value" #class  variable

def self.class_method
    puts @class_ins_var
    puts @@class_var
end

def instance_method
    puts @class_ins_var
    puts @@class_var
end
end

Vars.class_method

puts "see the difference"

obj = Vars.new

obj.instance_method

class VarsChild < Vars


end

VarsChild.class_method

31voto

bioneuralnet Points 3407

Je crois que la principale (seule?) est différente de l'héritage:

class T < S
end

p T.k
=> 23

S.k = 24
p T.k
=> 24

p T.s
=> nil

Variables de classe sont partagés par tous les "instances de classe" (c'est à dire les sous-classes), tandis que la classe des variables d'instance sont spécifiques à cette classe. Mais si vous n'avez jamais l'intention de prolonger votre classe, la différence est purement académique.

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