Dostęp do zmiennej instancji spoza klasy
Jeśli zmienna instancji należy do klasy, Czy Mogę uzyskać dostęp do zmiennej instancji (np. @hello
) Bezpośrednio przy użyciu instancji klasy?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
2 answers
Tak, możesz użyć instance_variable_get
w 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) otrzymujemy nil
.
Jak wspomina Andrzej w komentarzu:
Nie powinieneś ustawiać tego domyślnego sposobu dostępu do zmiennych instancji, ponieważ narusza to hermetyzację.
Lepszym sposobem jest zdefiniowanie accesora:
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żesz alias accessor: alias :my_hello :hello
.
I jeśli Klasa nie jest zdefiniowany w kodzie, ale w klejnocie: możesz modyfikować klasy w kodzie i wstawiać nowe funkcje do klas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 09:26:21
Możesz również to osiągnąć, dzwoniąc attr_reader
lub attr_accessor
w następujący 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
utworzy getter
dla podanej zmiennej:
h = Hello.new
p h.hello #"pavan"
Wywołanie attr_accessor
utworzy getter
i setter
dla podanej zmiennej:
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
Jak możesz zrozumieć, użyj odpowiednio attr_reader
i attr_accessor
. Używaj tylko attr_accessor
, Gdy potrzebujesz getter
i setter
i używaj attr_reader
, Gdy potrzebujesz tylko getter
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-23 17:46:50