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
Author: Andrew Marshall, 2012-08-25

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.

 118
Author: knut,
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

 9
Author: Kevinvhengst,
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