Якщо змінна екземпляра належить до класу, чи можу я отримати доступ до змінної екземпляра (наприклад @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
І 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