Les variables d'instance en Ruby peuvent être un peu déroutantes lors de l'apprentissage de Ruby, surtout si vous êtes habitué à un autre langage OO comme Java.
Vous ne pouvez pas simplement déclarer une variable d'instance.
Une des choses les plus importantes à savoir sur les variables d'instance en ruby, en dehors de la notation avec un préfixe de signe @, est que ils prennent vie la première fois qu'ils sont assignés à .
class Hello
def create_some_state
@hello = "hello"
end
end
h = Hello.new
p h.instance_variables
h.create_some_state
p h.instance_variables
# Output
[]
["@hello"]
Vous pouvez utiliser la méthode Object#instance_variables
pour lister toutes les variables d'instance d'un objet.
Normalement, vous "déclarez" et initialisez toutes les variables d'instance dans la méthode initialize. Une autre façon de documenter clairement les variables d'instance qui doivent être accessibles au public est d'utiliser les méthodes du module attr_accessor
(lecture/écriture), attr_writer
(écrire) et attr_reader
(lire). Ces méthodes synthétiseront différentes méthodes d'accesseur pour la variable d'instance listée.
class Hello
attr_accessor :hello
end
h = Hello.new
p h.instance_variables
h.hello = "hello"
p h.instance_variables
# Output
[]
["@hello"]
La variable d'instance n'est toujours pas créée tant qu'elle n'est pas assignée à l'aide de la fonction synthétisée Hello#hello=
méthode.
Un autre problème important, comme l'a décrit kch, est que vous devez être conscient des différents contextes actifs lors de la déclaration d'une classe. Lors de la déclaration d'une classe, le contexte récepteur par défaut (self) dans la portée la plus externe sera l'objet qui représente la classe elle-même. Par conséquent, votre code créera d'abord une variable d'instance de classe lors de l'affectation à @hello
au niveau de la classe.
Méthodes internes self sera l'objet sur lequel la méthode est invoquée, donc vous essayez d'imprimer la valeur d'une variable d'instance portant le nom de @hello
dans l'objet, qui n'existe pas (notez qu'il est parfaitement légal de lire une variable d'instance inexistante).