objetos manejo lista herencia ejemplos clases clase ruby instance-variables

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