¿Por qué deberían ser evitados @@ class_variables en Ruby?
-
05-10-2019 - |
Pregunta
Sé que algunos decir que las variables de clase (por ejemplo @@class_var
) deben ser Evitar en Ruby y deben utilizar la variable de una instancia (por ejemplo @instance_var
) en el ámbito de clase en su lugar:
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
¿Por qué el uso de variables de clase mal visto en Ruby?
Solución
Las variables de clase son a menudo difamados veces debido a sus comportamientos en materia de propiedad confusos:
class Foo
@@foo = 42
def self.foo
@@foo
end
end
class Bar < Foo
@@foo = 23
end
Foo.foo #=> 23
Bar.foo #=> 23
Si utiliza variables de instancia de clase en su lugar, se obtiene:
class Foo
@foo = 42
def self.foo
@foo
end
end
class Bar < Foo
@foo = 23
end
Foo.foo #=> 42
Bar.foo #=> 23
Esto es a menudo más útil.
Otros consejos
Tenga cuidado; @@variables
clase y @variables
instancia no son la misma cosa.
En esencia, cuando se declara una clase variable en una clase base, se comparte con todas las subclases. cambiando su valor en una subclase afectará a la clase base y todas sus subclases todo el camino hasta el árbol de herencia. Este comportamiento es a menudo exactamente lo que está deseado. Pero con la misma frecuencia, este comportamiento no es lo que fue la intención de el programador, y conduce a errores, especialmente si el programador no lo hizo Originalmente esperar de la clase que sea una subclase de otra persona.
De: http: // sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby