Créons maintenant une classe Personne. Une personne doit avoir un prénom, un nom de famille, une adresse e-mail, un numéro de téléphone, et une adresse physique (celle que nous venons d'implémenter à la section précédente):
class Personne attr_accessor :prenom, :nom, :email, :telephone, :adresse def initialize @prenom = @nom = @email = @telephone = "" @adresse = Adresse.new end end
La seule chose qui pourrait vous surprendre dans cet exemple, c'est la ligne @adresse = Adresse.new. La variable @adresse n'est pas une chaîne de caractères comme les autres variables, mais un objet issu de la classe Adresse.
Il est maintenant possible de créer une personne:
# Adresse: adresse_de_nicolas = Adresse.new adresse_de_nicolas.rue = "Rue du port, 32" adresse_de_nicolas.code_postal = "56000" adresse_de_nicolas.ville = "Vannes" # Personne: nicolas = Personne.new nicolas.prenom = "Nicolas" nicolas.nom = "Rocher" nicolas.email = "nicolas.rocher@free.fr" nicolas.adresse = adresse_de_nicolas
Note | |
---|---|
Notez que nous n'avons ni affecté de pays, ni de numéro de téléphone à Nicolas. Comme par défaut, toutes les valeurs sont vides (c'est à dire ""), nous pouvons créer des objets Adresse et Personne avec des informations incomplètes. Et nous pouvons toujours appeler nicolas.telephone sans aucun problème, Ruby nous renverra "" en retour. Essayez dans IRB! |
Et si nous ajoutions une méthode dans la classe Personne, qui nous renverrait le nom complet de la personne représentée? Très facile:
class Personne attr_accessor :prenom, :nom, :email, :telephone, :adresse def initialize @prenom = @nom = @email = @telephone = "" @adresse = Adresse.new end def nom_complet @prenom + " " + @nom end end # ... puts nicolas.nom_complet
Ce qui affichera "Nicolas Rocher".
Ne serait-il pas magnifique si nous pouvions simplement taper puts adresse_de_nicolas? Ruby est capable d'exaucer ce rêve.
La fonction puts travaille de la façon suivante: elle essaye d'appeler la méthode to_s sur l'objet qu'on lui donne, et elle affiche le résultat sur l'écran. Vous vous souvenez de Integer#to_s et de ses amis?
La seule chose à faire, c'est de définir une méthode Adresse#to_s:
class Adresse attr_accessor :rue, :code_postal, :ville, :pays def initialize @rue = @code_postal = @ville = @pays = "" end def to_s " " + @rue + "\n" + \ " " + @code_postal + ", " + @ville + "\n" \ " " + @pays end end
Note | |
---|---|
Le caractère \n représente une nouvelle ligne. Il s'agit un fait du caractère que votre clavier envoie lorsque vous pressez la touche Enter. |
Nous pouvons maintenant taper ceci:
adresse = Adresse.new adresse.rue = "Rue du port, 32" adresse.code_postal = "56000" adresse.ville = "Vannes" adresse.pays = "France" puts adresse
Ce qui affichera:
Rue du port, 32 56000, Vannes France