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
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 .
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