web-dev-qa-db-fra.com

Variable d'instance d'accès en dehors de la classe

Si une variable d'instance appartient à une classe, puis-je accéder à la variable d'instance (par exemple, @hello) utilisant directement l'instance de classe?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1
77
Pawan

Oui, vous pouvez utiliser instance_variable_get comme ça:

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"

Si la variable est indéfinie (premier appel de instance_variable_get dans mon exemple) vous obtenez nil.


Comme Andrew le mentionne dans son commentaire:

Vous ne devez pas en faire la manière par défaut d’accéder aux variables d’instance car elle enfreint l’encapsulation.

Un meilleur moyen est de définir un accesseur:

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"

Si vous voulez un autre nom de méthode, vous pouvez alias l'accesseur: alias :my_hello :hello.

Et si la classe n'est pas définie dans votre code, mais dans une gemme: Vous pouvez modifier les classes dans votre code et insérer de nouvelles fonctions dans les classes .

132
knut

Vous pouvez également accomplir cela en appelant attr_reader ou attr_accessor comme ça:

class Hello
  attr_reader :hello

  def initialize
    @hello = "pavan"
  end
end

ou

class Hello
  attr_accessor :hello

  def initialize
    @hello = "pavan"
  end
end

Appeler attr_reader créera un getter pour la variable donnée:

h = Hello.new
p h.hello        #"pavan"

Appeler attr_accessor créera un getter ET un setter pour la variable donnée:

h = Hello.new
p h.hello        #"pavan"
h.hello = "John"
p h.hello        #"John"

Comme vous pouvez le comprendre, utilisez attr_reader et attr_accessor en conséquence. Seule utilisation attr_accessor lorsque vous avez besoin d’un getter ET d’un setter et que vous utilisiez attr_reader lorsque vous n’avez besoin que de getter

11
Kevinvhengst