Подтвердить что ты не робот

Доступ к переменной экземпляра экземпляра вне класса

Если переменная экземпляра принадлежит классу, могу ли я получить доступ к переменной экземпляра (например, @hello) непосредственно с помощью экземпляра класса?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1
4b9b3361

Ответ 1

Да, вы можете использовать instance_variable_get следующим образом:

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"

Если переменная undefined (первый вызов instance_variable_get в моем примере), вы получаете nil.


Как упоминает Андрей в своем комментарии:

Вы не должны делать это по умолчанию, так как вы обращаетесь к переменным экземпляра, поскольку это нарушает инкапсуляцию.

Лучше всего определить аксессор:

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"

Если вы хотите другое имя метода, вы можете добавить псевдоним к аксессуру: alias :my_hello :hello.

И если класс не определен в вашем коде, а в камне: вы можете изменить классы в своем коде и вставить новые функции в классы.

Ответ 2

Вы также можете выполнить это, вызвав attr_reader или attr_accessor следующим образом:

class Hello
  attr_reader :hello

  def initialize
    @hello = "pavan"
  end
end

или

class Hello
  attr_accessor :hello

  def initialize
    @hello = "pavan"
  end
end

Вызов attr_reader создаст getter для данной переменной:

h = Hello.new
p h.hello        #"pavan"

Вызов attr_accessor создаст для данной переменной getter AND a setter:

h = Hello.new
p h.hello        #"pavan"
h.hello = "John"
p h.hello        #"John"

Как вы понимаете, используйте attr_reader и attr_accessor соответственно. Используйте attr_accessor только тогда, когда вам нужен getter И a setter и используйте attr_reader, когда вам нужен только getter