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


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

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

h = Hello.new
puts h.method1
2 64

2 ответа:

Да, вы можете использовать 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"

если переменная не определена (первый вызов 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.

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

вы также можете сделать это путем вызова 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 и setter для данной переменной:

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

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