Доступ к переменной экземпляра из-за пределов класса
Если переменная экземпляра принадлежит классу, могу ли я получить доступ к переменной экземпляра (например,@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