Plus de classes

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