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