2011-05-18 27 views
5

A veces veo una variable de instancia definida como @my_variable. Sin embargo, a veces veo self.my_variable. ¿Cuándo se usa cada uno?Ruby instancia variables y métodos

+2

En Ruby, por lo general están en 'snake_case', como' @ my_variable' y 'self.my_variable'. –

+0

Creo que esta pregunta se ha formulado antes, pero no puedo encuéntrelo. –

Respuesta

1

Las variables de instancia son más primordiales que los métodos que las llaman. En self.myVariable, myVariable es un método que hace referencia a la variable de instancia @myVariable, y ese método se define generalmente por attr_reader o attr_accessor.

Uno de los objetivos de la programación orientada a objetos es encapsular cosas particulares de una instancia dentro de esa instancia y hacerla inaccesible desde fuera de ella. De esta forma, puedes evitar conflictos de nombre no deseados. Esto es cierto para las variables de ejemplo. Por lo general, son parámetros que deben manejarse dentro de la instancia y no deben usarse fuera de la misma.

En una instancia, sus variables de instancia pueden ser referidas directamente, y por lo tanto no hay necesidad de referirse a ellas a través de llamadas a métodos. Debería llamar directamente a la variable @myVariable.

Desde fuera de una instancia, no puede referirse directamente a las variables de instancia debido a la razón mencionada anteriormente. Pero a veces, necesitas referirte a ellos. El propósito de usar el método myVariable es referirse a la variable de instancia desde el exterior de una instancia.

12

Las variables de instancia (@variable) corresponden a variables privadas en otros idiomas. self.myvariable en realidad no es una variable, sino una llamada a un método. Del mismo modo, si escribe self.myvariable = something, en realidad es una llamada al self.myvariable=(something). Esto corresponde a propiedades con getters y setters en otros idiomas.

class Foo 
    def initialize 
    @bar = 42 
    end 

    def xyzzy 
    123 
    end 

    def xyzzy=(value) 
    puts "xyzzy set to #{value}!" 
    end 
end 

obj = Foo.new 
puts obj.xyzzy # prints: 123 
obj.xyzzy = 2 # prints: xyzzy set to 2 
puts obj.bar # error: undefined method 'bar' 

Puede utilizar attr_reader y attr_accessor para definir automáticamente captadores y definidores de una variable de instancia. attr_reader solo generará un getter, mientras que attr_accessor genera ambos.

class Parrot 
    attr_accessor :volts 

    def voom 
    puts "vooming at #{@volts} volts!" 
    end 
end 

polly = Parrot.new 
polly.volts = 4000 
polly.voom 
+0

No creo que los Rubyists se refieran a "propiedades" - tienden a referirse a "atributos". –

+0

@Andrew - Haz lo ¿Quiere decir cosas diferentes? – Brandon

+0

@Brandon: Creo que sí, pero lo comprobaré más tarde. –

0

@my_variable se refiere directamente a la variable de instancia, y es (en su mayor parte) inaccesible desde el exterior esa instancia.

self.my_variable está utilizando un método de acceso (como se define con attr_reader, attr_writer o attr_accessor internamente. Esto es en los casos en los que no puede ser una variable de instancia con nombre @my_variable (como es el caso con el modelo ActiveRecord atributos) o cuando el el estado interno difiere de lo que se expone públicamente.

Cuestiones relacionadas