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
Respuesta
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.
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
No creo que los Rubyists se refieran a "propiedades" - tienden a referirse a "atributos". –
@Andrew - Haz lo ¿Quiere decir cosas diferentes? – Brandon
@Brandon: Creo que sí, pero lo comprobaré más tarde. –
@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.
- 1. Uso de variables de instancia en métodos de clase - Ruby
- 2. Ruby: Diferencia entre Instancia y variables locales en Ruby
- 3. Variables de instancia de la clase Ruby y herencia
- 4. (U) Ruby Extensions: rb_gc_mark() y variables de instancia
- 5. Variables locales estáticas para métodos en Ruby?
- 6. Implementando métodos/variables de instancia en la herencia de prototipales
- 7. Las variables estáticas en los métodos de instancia
- 8. Inicializando variables de instancia de clase en Ruby
- 9. ¿Ruby tiene un method_missing equivalente para variables de instancia indefinidas?
- 10. Operadores y métodos en Ruby
- 11. Ruby Métodos y parámetros opcionales
- 12. ¿Cuándo se establecen las variables de instancia de Ruby?
- 13. variables de instancia de clase python y variables de clase
- 14. Valores predeterminados de variables de instancia y variables locales
- 15. Vim: Ruby & HTML omnicomplete no muestra los métodos/variables locales
- 16. MSTest, MyClassInitialize y variables de instancia
- 17. Ruby mixins y super métodos de llamada
- 18. ¿Cómo crear documentación para variables de instancia y métodos en Xcode?
- 19. ¿Cómo declarar variables de instancia y métodos no visibles o utilizables fuera de la instancia de clase?
- 20. Estructurando un módulo NodeJS - variables y métodos
- 21. C Variables privadas Obtener y establecer métodos
- 22. Variables de clase Ruby
- 23. ¿Cómo se accede a métodos de clases protegidos desde métodos de instancia en Ruby?
- 24. Variables de instancia de Java contra variables locales
- 25. Métodos de instancia llamando a métodos de clase llamando a los métodos de instancia
- 26. clase clase: métodos instancia vs. clase
- 27. ¿Métodos estáticos en módulos ruby?
- 28. Ruby, Unicorn y variables de entorno
- 29. iOS5: Confusión con loadview e init y variables de instancia
- 30. Enum como variables de instancia
En Ruby, por lo general están en 'snake_case', como' @ my_variable' y 'self.my_variable'. –
Creo que esta pregunta se ha formulado antes, pero no puedo encuéntrelo. –