Jeśli zmienna instancji należy do klasy, czy mogę uzyskać dostęp do zmiennej instancji (np. @hello
) Bezpośrednio za pomocą instancji klasy?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
Odpowiedzi:
Tak, możesz użyć w instance_variable_get
ten sposób:
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"
Jeśli zmienna jest niezdefiniowana (pierwsze wywołanie instance_variable_get
w moim przykładzie), otrzymasz nil
.
Jak wspomina Andrew w swoim komentarzu:
Nie należy ustawiać tego jako domyślnego sposobu uzyskiwania dostępu do zmiennych instancji, ponieważ narusza to hermetyzację.
Lepszym sposobem jest zdefiniowanie akcesora:
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"
Jeśli chcesz inną nazwę metody, można aliasu akcesor: alias :my_hello :hello
.
A jeśli klasa nie jest zdefiniowana w twoim kodzie, ale w klejnocie: możesz modyfikować klasy w swoim kodzie i wstawiać nowe funkcje do klas .
h = Hello.new
i h.method1
i h.hello
?
attr_reader :hello
alias my_hello hello
prawda alias :my_hello :hello
?
Możesz to również zrobić dzwoniąc attr_reader
lub w attr_accessor
ten sposób:
class Hello
attr_reader :hello
def initialize
@hello = "pavan"
end
end
lub
class Hello
attr_accessor :hello
def initialize
@hello = "pavan"
end
end
Wywołanie attr_reader
stworzy getter
dla danej zmiennej:
h = Hello.new
p h.hello #"pavan"
Wywołanie attr_accessor
utworzy getter
AND a setter
dla danej zmiennej:
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
Jak możesz zrozumieć, użyj attr_reader
i attr_accessor
odpowiednio. Używaj tylko attr_accessor
wtedy, gdy potrzebujesz getter
AND a setter
i używaj, attr_reader
gdy potrzebujesz tylkogetter