2010-09-24 11 views
14

Sé que algunos dicen que las variables de clase (por ejemplo @@class_var) debe ser evitar en Ruby y debe utilizar la variable de una instancia (por ejemplo @instance_var) en el ámbito de la clase en su lugar:¿Por qué debería evitar @@ class_variables en Ruby?

def MyClass 
    @@foo = 'bar' # Should not do this. 
    @foo = 'bar' # Should do this. 
end 

¿Por qué el uso de variables de clase frunció el ceño en Ruby?

+0

he leído hace poco dos libros sobre Ruby y ninguno de ellos mencionó esto tan interesante ver qué respuestas que obtendrá :) – willcodejavaforfood

+0

ver también [Diferencia entre las variables de clase y clase variables de instancia?] (https://stackoverflow.com/questions/3802540/difference-between-class-variables-and-class-instance-variables). –

Respuesta

27

Las variables de clase son a menudo hablaban mal debido a su comportamiento a veces confusa sobre la herencia:

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.

6

Ten cuidado; la clase @@variables y la instancia @variables no son lo mismo.

En esencia, cuando se declara una variable de clase en una clase base, se comparte con todas las subclases. Cambiar su valor en una subclase afectará la clase base y todas sus subclases a lo largo de todo el árbol de herencia. Este comportamiento es a menudo exactamente lo que es deseado. Pero con la misma frecuencia, este comportamiento no es el previsto por el programador , y conduce a errores, especialmente si el programador no esperaba originalmente para que la clase fuera subclasificada por otra persona.

Desde: http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby

Cuestiones relacionadas