Si una variable de instancia pertenece a una clase, ¿puedo acceder a la variable de instancia (por ejemplo @hello
) directamente usando la instancia de la clase?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
Respuestas:
Sí, puedes usarlo 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) 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 #nil
p h.method1 #"pavan" - initialization of @hello
p h.hello #"pavan"
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
y h.method1
y h.hello
?
attr_reader :hello
alias my_hello hello
así alias :my_hello :hello
?
También puede lograr esto llamando attr_reader
o attr_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á un getter
para la variable dada:
h = Hello.new
p h.hello #"pavan"
La llamada attr_accessor
creará un getter
AND a 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 en attr_accessor
consecuencia. Úselo solo attr_accessor
cuando necesite un getter
AND setter
y úselo attr_reader
cuando solo necesite ungetter