Pourquoi @@ class_variables éviter en Ruby?
-
05-10-2019 - |
Question
Je sais que certains disent que les variables de classe (par exemple @@class_var
) devraient être éviter en Ruby et doivent utiliser la variable d'instance (par exemple @instance_var
) dans le cadre de la classe à la place:
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Pourquoi l'utilisation des variables de classe désapprouvé dans Ruby?
La solution
les variables de classe sont souvent décrié en raison de leur comportement parfois confusion en ce qui concerne l'héritage:
class Foo
@@foo = 42
def self.foo
@@foo
end
end
class Bar < Foo
@@foo = 23
end
Foo.foo #=> 23
Bar.foo #=> 23
Si vous utilisez des variables d'instance de classe à la place, vous obtenez:
class Foo
@foo = 42
def self.foo
@foo
end
end
class Bar < Foo
@foo = 23
end
Foo.foo #=> 42
Bar.foo #=> 23
Il est souvent plus utile.
Autres conseils
Attention; classe @@variables
et @variables
instance ne sont pas la même chose.
Pour l'essentiel, lorsque vous déclarez une classe variable dans une classe de base, elle est partagée avec toutes les sous-classes. Modification de la valeur dans une sous-classe aura une incidence sur la classe de base et toutes ses sous-classes tout le long de l'arbre d'héritage. Ce comportement est souvent exactement ce voulu. Mais aussi souvent, ce comportement n'est pas ce qu'envisageaient le programmeur, et il conduit à des bogues, surtout si le programmeur n'a pas attendre à l'origine pour la classe à par quelqu'un d'autre sous-classé.
De: http: // sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby