Les objets peuvent conserver leur propre état en définissant des variables d'instance. Ces variables vivent à l'intérieur d'un objet et servent normalement à stocker un état interne.
Les variables d'instance commencent toujours par un @.
On peut créer une nouvelle variable d'instance en affectant une variable qui commence par un @.
Par exemple :
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
Les objets définissent généralement leur état initial dans une méthode initialize, qui est automatiquement appelée lorsqu'on appelle new sur une classe.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
La méthode initialize peut aussi prendre des arguments, afin que chaque instance puisse démarrer avec un état personnalisé :
class Suitcase
def initialize(locked)
@locked = locked
end
end
C'est une bonne pratique de considérer les variables d'instance comme privées vis-à-vis des lectures et des écritures externes. On définit plutôt des méthodes pour lire et écrire leurs valeurs. Par exemple :
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil est un mot anglais qui signifie « rien » ou « zéro ».
En Ruby, nil sert à exprimer l'absence d'un objet.
Dans d'autres langages de programmation, les valeurs null ou none peuvent jouer un rôle similaire.
# I do not have a favorite color
favorite_color = nil
Ruby donne à toute variable d'instance la valeur par défaut nil lors de sa première utilisation, jusqu'à ce qu'une valeur lui soit affectée.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Tu travailles pour un parc d'attractions et on t'a confié un cahier des charges pour concevoir un système qui gère la fréquentation et les attractions. Ta mission consiste à modéliser l'Attendee (la personne qui visite le parc).
Implémente la méthode Attendee#initialize de la classe Attendee : elle prend une taille (en centimètres) et la stocke dans une variable d'instance.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Implémente le getter Attendee#height de la classe Attendee : il renvoie la taille de l'instance.
Attendee.new(106).height
# => 106
Tous les visiteurs n'ont pas acheté de pass, mais on doit savoir s'ils en ont un ou non. Implémente le getter Attendee#pass_id de la classe Attendee : il doit renvoyer l'identifiant du pass de l'instance, ou nil si le visiteur n'en a pas.
Attendee.new(106).pass_id
# => nil
Implémente Attendee#issue_pass! pour modifier l'état de l'instance et affecter l'argument à la variable d'instance de l'identifiant du pass. Elle doit renvoyer l'identifiant du pass.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Certains visiteurs enfreignent les règles avec un comportement dangereux, c'est pourquoi le parc veut pouvoir révoquer des pass. Implémente Attendee#revoke_pass! pour modifier l'état de l'instance et mettre l'identifiant du pass à nil.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.