Доступ к переменной экземпляра из-за пределов класса
Если переменная экземпляра принадлежит классу, могу ли я получить доступ к переменной экземпляра (например,@hello
) непосредственно с помощью экземпляра класса?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
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