90 votes

Accéder à une variable d'instance depuis l'extérieur de la classe

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

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

h = Hello.new
puts h.method1

161voto

knut Points 10107

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 l'a mentionné dans son commentaire :

Vous ne devez pas en faire le mode d'accès par défaut aux variables d'instance, car cela viole l'encapsulation.

Une meilleure solution consiste à 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 .

24voto

Kevinvhengst Points 952

Vous pouvez également le faire en appelant attr_reader o 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

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

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

Appel à 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, utiliser attr_reader y attr_accessor en conséquence. N'utilisez que attr_accessor lorsque vous avez besoin d'un getter ET un setter et utiliser attr_reader alors que vous n'avez besoin que d'un getter

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X