manejo - objetos y clases en ruby
Variable de instancia de acceso desde fuera de la clase (2)
Sí, puedes usar instance_variable_get así:
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
p h.instance_variable_get(:@hello) #nil
p h.method1 #"pavan" - initialization of @hello
p h.instance_variable_get(:@hello) #"pavan"
Si la variable no está definida (primera llamada de instance_variable_get en mi ejemplo) obtienes nil .
Como Andrew mencionó en su comentario:
No debe hacer que esto sea la forma predeterminada de acceder a las variables de instancia ya que viola la encapsulación.
Una mejor manera es definir un descriptor de acceso:
class Hello
def method1
@hello = "pavan"
end
attr_reader :hello
end
h = Hello.new
p h.hello #nil
p h.method1 #"pavan" - initialization of @hello
p h.hello #"pavan"
Si desea otro nombre de método, puede alias el alias :my_hello :hello acceso: alias :my_hello :hello .
Y si la clase no está definida en tu código, sino en una gema: puedes modificar las clases en tu código e insertar nuevas funciones en las clases .
Si una variable de instancia pertenece a una clase, ¿puedo acceder a la variable de instancia (por ejemplo, @hello ) directamente utilizando la instancia de clase?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
También puede lograr esto llamando a attr_reader o attr_accessor esta manera:
class Hello
attr_reader :hello
def initialize
@hello = "pavan"
end
end
o
class Hello
attr_accessor :hello
def initialize
@hello = "pavan"
end
end
Llamar a attr_reader creará un getter para la variable dada:
h = Hello.new
p h.hello #"pavan"
Llamar attr_accessor creará un getter Y un setter para la variable dada:
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
Como puede comprender, use attr_reader y attr_accessor consecuencia. Solo use attr_accessor cuando necesite un getter AND setter y use attr_reader cuando solo necesite un getter