Saisir des données provenant de l'utilisateur

Dans cette section, nous allons écrire un programme qui salue l'utilisateur. Le programme lui demandera son nom avant de le saluer. La méthode pour lire une chaîne de caractère venant de l'utilisateur s'appelle gets.

Sauvez le fichier et démarrez-le:

Que s'est-il passé? Pourquoi ce fichu programme va-t'il à la ligne?

La réponse est évidente: tout simplement parce que vous avez entré une nouvelle ligne au clavier. Oui, souvenez-vous, quand vous avez appuyé sur la touche Enter...

Nous allons regarder ceci de plus près dans IRB. Démarrez IRB et tapez l'expression nom = gets. L'ordinateur va attendre une saisie, entrez une chaîne quelconque. Regardez attentivement ce qu'il va se passer:

Que signifie donc ce «\n» à la fin de la chaîne de caractères?

Ce «\n» représente un retour à la ligne. Il s'agit du caractère envoyé par le clavier lorsque l'utilisateur appuie sur la touche Enter.

[Tip]Astuce

Avez-vous remarqué comment nous venons d'utiliser IRB pour comprendre ce qu'il s'était passé? Il arrivera tôt ou tard que votre code se comporte d'une façon anormale. A ce moment là, essayez-le dans IRB, vous comprendrez plus facilement la source de vos ennuis!

OK, nous savons maintenant ce qui ne va pas. Mais comment résoudre ce problème?

Il existe précisément une méthode qui s'occupera de retirer le caractère «\n» d'une chaîne de caractères: String#chomp. Retournons dans IRB pour tester directement cette méthode:

Magnifique! La méthode String#chomp nous renvoie la chaîne de caractères sans le retour à la ligne. Nous pouvons donc maintenant écrire:

Notez bien que la variable nom contient toujours le saut à la ligne. La bonne variable (sans le «\n») est nouveau_nom. Mais pourquoi utiliser une autre variable? Pourquoi ne pas simplement écrire ceci:

>> nom = nom.chomp

De cette façon, nous retirons directement le saut à la ligne de la variable nom.

Il est maintenant temps de corriger le problème dans notre code:

Une dernière petite réflexion:

Pourquoi ne pas écrire gets.chomp? De cette façon, String#chomp sera appelé sur ce que gets retournera. En d'autres termes, nous pouvons écrire:

N'est-ce pas joli? Mettez à jour votre code et invoquez Ruby: