Sí, puedes usarlo instance_variable_get
así:
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
p h.instance_variable_get(:@hello)
p h.method1
p h.instance_variable_get(:@hello)
Si la variable no está definida (primera llamada de instance_variable_get
en mi ejemplo) se obtiene nil
.
Como Andrew menciona en su comentario:
No debe hacer que esta sea la forma predeterminada de acceder a las variables de instancia, ya que viola la encapsulación.
Una mejor forma es definir un descriptor de acceso:
class Hello
def method1
@hello = "pavan"
end
attr_reader :hello
end
h = Hello.new
p h.hello
p h.method1
p h.hello
Si desea que otro nombre del método, se puede crear un alias el descriptor de acceso: alias :my_hello :hello
.
Y si la clase no está definida en su código, sino en una gema: puede modificar clases en su código e insertar nuevas funciones en las clases .
h = Hello.new
yh.method1
yh.hello
?attr_reader :hello
alias my_hello hello
asíalias :my_hello :hello
?También puede lograr esto llamando
attr_reader
oattr_accessor
así:class Hello attr_reader :hello def initialize @hello = "pavan" end end
o
class Hello attr_accessor :hello def initialize @hello = "pavan" end end
Llamar
attr_reader
creará ungetter
para la variable dada:h = Hello.new p h.hello #"pavan"
La llamada
attr_accessor
creará ungetter
AND asetter
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 enattr_accessor
consecuencia. Úselo soloattr_accessor
cuando necesite ungetter
ANDsetter
y úseloattr_reader
cuando solo necesite ungetter
fuente