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