04. Tout Mélanger
Nous avons vu quelques types d'objets différents (nombres et lettres), et nous avons créé des variables pour pointer vers eux ; la prochaine chose que nous voulons faire est de les faire jouer ensemble gentiment.
Nous avons vu que si nous voulons qu'un programme affiche 25, le code suivant ne fonctionnera pas, car vous ne pouvez pas additionner des nombres et des chaînes :
var1 = 2
var2 = '5'
puts var1 + var2
Une partie du problème est que votre ordinateur ne sait pas si vous essayez d'obtenir 7 (2 + 5) ou 25 ('2' + '5').
Avant de pouvoir les additionner, nous avons besoin d'un moyen d'obtenir la version chaîne de var1, ou d'obtenir la version entière de var2.
Conversions
Pour obtenir la version chaîne d'un objet, nous écrivons simplement .to_s après lui :
var1 = 2
var2 = '5'
puts var1.to_s + var2
25
De même, .to_i donne la version entière d'un objet, et .to_f donne la version flottante. Regardons ce que ces trois méthodes font (et ne font pas) d'un peu plus près :
var1 = 2
var2 = '5'
puts var1.to_s + var2
puts var1 + var2.to_i
25
7
Remarquez que, même après avoir obtenu la version chaîne de var1 en appelant .to_s, var1 pointait toujours vers 2, et jamais vers '2'. À moins que nous réassignions explicitement var1 (ce qui nécessite un signe =), elle pointera vers 2 pour la durée de vie du programme.
Maintenant, essayons quelques conversions plus intéressantes (et quelques-unes tout simplement bizarres) :
puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 est mon nombre préféré !'.to_i
puts 'Qui t\'a demandé pour le 5 ?'.to_i
puts 'Ta mère.'.to_f
puts ''
puts 'ficelle'.to_s
puts 3.to_i
15.0
99.999
99
5
0
0.0
ficelle
3
Donc, il y a probablement eu quelques surprises là. La première est assez standard, donnant 15.0. Après cela, nous avons converti la chaîne '99.999' en un flottant et en un entier. Le flottant a fait ce que nous attendions ; l'entier a été, comme toujours, arrondi vers le bas.
Ensuite, nous avons eu quelques exemples de... chaînes inhabituelles converties en nombres. .to_i ignore la première chose qu'elle ne comprend pas, et le reste de la chaîne à partir de ce point. Donc la première a été convertie en 5, mais les autres, puisqu'elles commençaient par des lettres, ont été ignorées complètement... donc l'ordinateur choisit simplement zéro.
Enfin, nous avons vu que nos deux dernières conversions n'ont rien fait du tout, comme nous nous y attendions.
Un Autre Regard sur puts
Il y a quelque chose d'étrange à propos de notre méthode préférée... Jetez un œil à ceci :
puts 20
puts 20.to_s
puts '20'
20
20
20
Pourquoi ces trois-là affichent-elles toutes la même chose ? Eh bien, les deux dernières devraient, puisque 20.to_s est '20'. Mais qu'en est-il de la première, l'entier 20 ? D'ailleurs, que signifie écrire l'entier 20 ? Quand vous écrivez un 2 et ensuite un 0 sur un morceau de papier, vous écrivez une chaîne, pas un entier. L'entier 20 est le nombre de doigts et d'orteils que j'ai ; ce n'est pas un 2 suivi d'un 0.
Eh bien, voici le grand secret derrière notre ami puts : avant que puts n'essaie d'écrire un objet, il utilise .to_s pour obtenir la version chaîne de cet objet. En fait, le s dans puts signifie string (chaîne) ; puts signifie vraiment put string (mettre chaîne).
Cela peut ne pas sembler très excitant maintenant, mais il existe de très nombreux types d'objets dans Ruby (vous apprendrez même à créer les vôtres !), et il est bon de savoir ce qui se passera si vous essayez de faire un puts sur un objet vraiment bizarre, comme une photo de votre grand-mère, ou un fichier musical ou quelque chose comme ça. Mais cela viendra plus tard...
En attendant, nous avons quelques méthodes de plus pour vous, et elles nous permettent d'écrire toutes sortes de programmes amusants...
Les Méthodes gets et chomp
Si puts signifie put string, je suis sûr que vous pouvez deviner ce que signifie gets (get string, obtenir chaîne). Et tout comme puts recrache toujours des chaînes, gets ne récupérera que des chaînes. Et d'où les obtient-il ?
De vous ! Eh bien, de votre clavier. Puisque votre clavier ne fait que des chaînes, cela fonctionne à merveille. Ce qui se passe réellement, c'est que gets reste assis là, lisant ce que vous tapez jusqu'à ce que vous appuyiez sur Entrée. Essayons :
puts gets
Y a-t-il un écho ici ?
Y a-t-il un écho ici ?
Bien sûr, tout ce que vous tapez vous sera simplement répété. Exécutez-le quelques fois et essayez de taper différentes choses.
Maintenant, nous pouvons faire des programmes interactifs ! Dans celui-ci, tapez votre nom et il vous saluera :
puts 'Bonjour, et quel est votre nom ?'
name = gets
puts 'Votre nom est ' + name + ' ? Quel joli nom !'
puts 'Ravi de vous rencontrer, ' + name + '. :)'
Beurk ! Je viens de l'exécuter — j'ai tapé mon nom — et ceci s'est produit :
Bonjour, et quel est votre nom ?
Chris
Votre nom est Chris
? Quel joli nom !
Ravi de vous rencontrer, Chris
. :)
Hmmm... on dirait que lorsque j'ai tapé les lettres C, h, r, i, s, et ensuite appuyé sur Entrée, gets a obtenu toutes les lettres de mon nom et l'Entrée ! Heureusement, il existe une méthode juste pour ce genre de chose : chomp. Elle enlève tous les Entrée qui traînent à la fin de votre chaîne. Essayons ce programme à nouveau, mais avec chomp pour nous aider :
puts 'Bonjour, et quel est votre nom ?'
name = gets.chomp
puts 'Votre nom est ' + name + ' ? Quel joli nom !'
puts 'Ravi de vous rencontrer, ' + name + '. :)'
Bonjour, et quel est votre nom ?
Chris
Votre nom est Chris ? Quel joli nom !
Ravi de vous rencontrer, Chris. :)
Bien mieux ! Remarquez que puisque name pointe vers gets.chomp, nous n'avons pas à dire name.chomp ; name a déjà été "mâché" (chomped).
Quelques Petites Choses à Essayer
- Écrivez un programme qui demande le prénom d'une personne, puis son deuxième prénom, et enfin son nom de famille. Enfin, il devrait saluer la personne en utilisant son nom complet.
- Écrivez un programme qui demande le nombre préféré d'une personne. Faites en sorte que votre programme ajoute un au nombre, puis suggère le résultat comme un nombre préféré plus grand et meilleur. (Faites-le avec tact).
Une fois que vous avez terminé ces deux programmes (et tous les autres que vous voulez essayer), apprenons quelques méthodes de plus (et un peu plus à leur sujet).