I. Les bases▲
À propos de ce chapitre
Ce chapitre se focalise sur les bases fondamentales nécessaires afin que vous puissiez écrire votre premier programme en Ruby. Il est donc indispensable pour toute personne qui veut programmer en Ruby de lire ce chapitre.
I-A. Premiers pas▲
Nous allons commencer notre exploration du langage Ruby en utilisant l'invite de commande interactif IRB (en anglais, « interactive ruby shell »). Pour ce faire, ouvrez un terminal et entrez :
irb --simple-prompt
Vérifiez que le programme IRB démarre correctement avant de continuer.
I-A-1. Utiliser Ruby comme une calculatrice▲
L'interpréteur interactif IRB peut s'utiliser facilement comme calculatrice :
Ruby est capable d'évaluer toutes les opérations arithmétiques de base :
Symbole |
Effet |
---|---|
+ |
addition |
- |
soustraction |
* |
multiplication |
/ |
division |
Pour quitter le programme IRB, il suffit d'entrer exit :
Nous allons maintenant jouer un peu plus avec les opérations arithmétiques de base. Essayez ceci :
Remarquez bien le comportement de Ruby lorsque nous essayons de diviser 3 par 2 :
Que s'est-il passé ? Rien d'anormal, je vous rassure! Ruby nous montre simplement qu'il travaille avec deux classes différentes de nombres :
- entiers ;
- décimaux (appelés aussi « flottants »).
I-A-2. Les nombres et Ruby▲
I-A-2-a. Entiers▲
Un entier est un nombre comme 1, 2, -5, etc. Lorsque nous travaillerons avec des entiers, Ruby nous donnera toujours une réponse mathématiquement exprimée sous forme entière.
3 / 2 devrait nous donner 1.5, mais comme cette valeur n'est pas entière et que les deux nombres utilisés dans l'opération sont entiers, Ruby renverra donc à la place une réponse formulée sous forme entière, c'est-à-dire 1.
I-A-2-b. Décimaux▲
Un nombre décimal est souvent appelé «flottant», par analogie avec sa partie décimale. 3.14, 1.5 et 3.0 sont des flottants. Ruby renverra toujours une valeur flottante comme résultat pour des opérations arithmétiques agissant sur des flottants. Par exemple :
I-A-3. Autres opérateurs arithmétiques▲
Avant d'en finir avec ce chapitre, jetons un petit coup d'œil à deux autres opérateurs arithmétiques :
Symbole |
Effet |
---|---|
** |
exposant |
% |
modulo (le reste d'une division) |
Notez bien le comportement de l'opérateur % avec les nombres décimaux. Dans cet exemple, 2 rentre deux fois dans 5.1, et il reste 1.1 de trop.
I-A-4. Nombres énormes, et nombres minuscules▲
Ruby convient très bien lorsqu'il s'agit de travailler avec de très grands et de très petits nombres. Supposez par exemple que vous souhaitez enregistrer quelque part le nombre 192349562563447.
Bon, c'est loin d'être facile à lire. Dans la vie courante, nous sommes habitués à séparer les chiffres par des caractères spéciaux, en fonction du pays d'origine (il s'agit souvent d'une virgule, d'un point ou d'un espace blanc). Par exemple, nos amis anglo-saxons auraient représenté ce fameux nombre de cette façon : 192,349,562,563,447. Ruby fonctionne exactement de la même façon, en utilisant des « blancs soulignés » (en anglais, « underscores ») :
Comment faire si vous désirez travailler avec des nombres énormes comme 17_000_000_000_000_000_000, ou des nombres minuscules comme 0.000_000_000_000_321? En temps normal, la méthode la plus simple (et la plus paresseuse) consiste à utiliser une notation scientifique en écrivant 1.7 x 1019, et 3.21 x 10-13. Et comme vous vous en seriez douté, Ruby permet évidemment d'utiliser cette notation :
I-A-5. Quelques exercices▲
- Calculez le nombre d'heures contenues dans année.
- Calculez le nombre de minutes dans une décennie.
- Quel est votre âge en secondes ?
- Que vaut l'expression 3.24 * ((34/2) - 54)/33.4 * 3.4 ? (notez qu'il est possible d'utiliser des parenthèses)
- Quel sera le résultat d'une opération qui combine à la fois des flottants et des entiers ? Par exemple, calculez ceci : 3.0 / 2 ; 3 / 2.0 ; 4 ** 2.0 ; 4.1 % 2
La réponse sera-t-elle donnée sous forme entière ou décimale ?
I-B. Chaines de caractères▲
Les nombres ne sont pas les seuls types de données que vous utiliserez pour programmer avec Ruby. En effet, vous allez probablement devoir manipuler des lettres, des mots ou encore des blocs de texte.
Ruby identifie ce genre de données par le terme chaine de caractères (en anglais, « string »). Voici quelques exemples de chaines
- « a »
- « Salut. »
- « Longue vie à Ruby !!! »
- « 5 est mon nombre préféré. Quel est le vôtre? »
- « Snoopy a dit: #%^?*@! »
I-B-1. Opérateurs▲
Voici quelques trucs amusants que Ruby vous permet de faire avec des chaines de caractères :
Voici un moyen de s'en souvenir : « salut » * 3 fait la même chose que « salut » + « salut » + « salut » , ce qui nous donnera donc « salut salut salut ».
Remarquez ce qu'il se passe lorsque nous retirons l'espace blanc de « salut » :
Maintenant, regardez ceci :
Ruby considère « 1 » comme étant une chaine de caractères, pas un nombre.
I-B-2. Méthodes▲
Voici quelques méthodes utiles qui travaillent avec des chaines de caractères :
I-B-3. Quelques exercices▲
Quel sera le résultat de l'expression suivante : 'Bonjour '.length + 'monde!'.length ?
I-C. De nouveaux noms pour de vieilles choses▲
Ruby identifie par des noms spéciaux certaines choses que nous connaissons déjà. Par exemple, il utilise le mot Float («flottant») pour représenter un nombre décimal. Voici quelques autres définitions :
- Object (« objet ») : Ce n'est rien d'autre qu'un bout de données. Par exemple, le nombre 3 ou la chaine de caractères « Salut! » sont des objets ;
- Class (« classe ») : Ruby sépare toujours les types de données en classes. Par exemple, les entiers, les flottants et les chaines de caractères sont représentés par des classes différentes ;
- Method (« méthode ») : Les méthodes sont des bouts de code qui peuvent travailler sur des objets. Par exemple, l'opérateur + (qui permet d'additionner deux objets, souvent des entiers ou des chaines) est bel et bien une méthode.
Voici la liste des classes Ruby associées aux types de données que vous venez de découvrir :
Type de donnée |
Classe associée |
---|---|
nombre entier |
Integer |
nombre décimal |
Float |
texte |
String |
Souvenez-vous, vous avez également utilisé plusieurs méthodes associées à ces classes :
Classe |
Quelques méthodes |
---|---|
Integer |
+, -, /, *, %, ** |
Float |
+, -, /, *, %, ** |
String |
capitalize, reverse, length, upcase, +, * |
I-C-1. Classes et objets▲
Soyez certain de bien comprendre la différence entre une classe et un objet. Un objet, c'est une donnée quelconque. Une classe, c'est la structure de l'objet, ce à quoi il ressemble, ce qui le différencie des autres objets.
Par exemple, 3 et 5 sont des nombres différents. Ce sont donc des objets différents. Mais ce sont tous deux des nombres entiers, donc ils appartiennent à la même classe («Integer»). Voici quelques exemples :
Objet |
Classe |
---|---|
2, -5 |
Integer |
7.2, 3.14 |
Float |
« Vive », « Ruby » |
String |
I-C-2. La notation Classe#méthode▲
Souvenez-vous, différentes classes peuvent avoir différentes méthodes. Voici quelques différences que nous avons déjà remarquées dans ce chapitre :
- l'opérateur de division (/) ne fonctionne pas de la même façon avec des entiers et des flottants ;
- l'opérateur d'addition (+) se comporte différemment avec des nombres et des chaines de caractères. Il peut servir à calculer le résultat de l'addition de deux nombres, et il peut également concaténer deux chaines de caractères ;
- les chaines de caractères possèdent plusieurs méthodes que les entiers et les flottants n'ont pas. Par exemple : capitalize, length, upcase, etc..
Pour cette raison, nous utiliserons la notation Classe#méthode pour identifier exactement de quelle méthode nous parlerons. Par exemple, nous dirons Integer#+ afin de différencier cette méthode de Float#+ et de String#+. Nous pouvons également affirmer que String#upcase existe, mais que Integer#upcase n'existe pas.
I-C-3. Convertir une classe▲
Voici quelques méthodes permettant d'effectuer des conversions pour les trois classes que nous venons d'étudier :
Méthode |
Classe de départ |
Classe d'arrivée |
---|---|---|
String#to_i |
Chaine de caractères |
Entier |
String#to_f |
Chaine de caractères |
Flottant |
Float#to_i |
Flottant |
Entier |
Float#to_s |
Flottant |
Chaine de caractères |
Integer#to_f |
Entier |
Flottant |
Integer#to_s |
Entier |
Chaine de caractères |
Un petit exemple pratique avec notre ami IRB :
I-C-4. Convertir une classe▲
Vous pouvez demander à Ruby si un objet est issu d'une classe particulière. Essayez ceci dans l'interpréteur :
12.is_a?(Integer)
12.is_a?(Float)
12.is_a?(String)
'12'.is_a?(Integer)
'12'.is_a?(Float)
'12'.is_a?(String)
12.0.is_a?(Integer)
12.0.is_a?(Float)
12.0.is_a?(String)
Essayez également ceci :
12 + 12
'12' + '12'
'12'.to_i + 12
'12' + 12.to_s
12 * 12
'12' * 12
Avez-vous obtenu les résultats que vous espériez ?
Comment expliqueriez-vous la différence entre 12, '12' et 12.0 à un enfant ?
I-D. Variables▲
Ruby vous permet d'utiliser des variables pour associer des noms à des objets particuliers. Exemple
ville = "Toronto"
Ici, Ruby associe la chaine de caractères « Toronto » à la variable ville.
Si vous avez des difficultés, imaginez-vous Ruby fabriquant deux tableaux. Un contenant les objets, et un autre contenant les noms qui leur sont associés. Ensuite, imaginez-vous Ruby dessinant une flèche de ville à « Toronto ».
Lorsque Ruby rencontrera la variable ville, il suivra logiquement la flèche et arrivera sur la chaine de caractères « Toronto ».
Les noms de variables doivent toujours commencer par une minuscule!
I-D-1. Travailler avec des variables▲
Vous pouvez manipuler des variables exactement de la même façon que vous auriez manipulé les objets qu'elles représentent. Voici un exemple :
L'avantage des variables, c'est que vous pouvez garder quelque part une trace de vos données facilement. Imaginez par exemple que l'on vous donne les instructions suivantes :
- Additionnez ensemble 2, 4, 6 et 8 ;
- Prenez le résultat, et divisez-le par 5 ;
- Calculez le produit simultané de 2, 3 et 4 ;
- Prenez le résultat obtenu à la ligne 2, et soustrayez-y ce que vous venez d'obtenir à la ligne 3.
Bien entendu, vous pouvez écrire une longue expression pour calculer ceci. Mais il est évidemment plus facile d'écrire :
I-D-2. Raccourcis▲
Dans l'exemple ci-dessus, nous avons vu les expressions :
x = x / 5
y = y - x
On rencontre assez souvent ce genre d'expressions, donc Ruby (qui pense à nous) nous permet d'utiliser les raccourcis suivants :
Exemple |
Raccourci |
Effet |
---|---|---|
x = x + 2 |
x += 2 |
Additionner 2 à x |
x = x - 3 |
x -= 3 |
Soustraire 3 de x |
x = x * 6 |
x *= 6 |
Multiplier x par 6 |
x = x / 2 |
x /= 2 |
Diviser x par 2 |
x = x**3 |
x **= 3 |
Exposer x au cube |
x = x % 4 |
x %= 4 |
Calculer le reste de la division de x par 4, et y enregistrer le résultat |
Donc, notre exemple du dessus aurait pu être écrit de cette façon :
I-D-3. Constantes▲
Les constantes ressemblent à des variables, à la différence près que vous informez Ruby que sa valeur est supposée ne pas changer. Si vous essayez de modifier la valeur d'une constante, Ruby vous enverra un avertissement.
Vous pouvez définir des constantes de la même façon que des variables, sauf que leur nom doit commencer par une majuscule.
Même si Ville est une constante, sa valeur change quand même. Définir une constante signifie seulement que Ruby vous avertira si vous modifiez sa valeur. Regardez :
I-D-4. Quelques exercices▲
Pensez-vous que les raccourcis fonctionnent également avec les chaines de caractères? Essayez ceci :
var = "Bonjour "
var += "monde"
À votre avis, que va donner ce code :
var = "salut"
var *= 3
Essayez-le. Comment auriez-vous expliqué le résultat à un enfant ?
I-E. Votre premier programme▲
Félicitations! Vous êtes maintenant prêt à commencer à écrire des programmes en Ruby.
I-E-1. Bonjour monde▲
Ouvrez votre éditeur favori, et entrez-y la ligne suivante :
puts "Bonjour monde"
Sauvez le fichier sous le nom de bonjour.rb et démarrez-le en invoquant
ruby bonjour.rb
puts est une méthode qui affiche une chaine de caractères sur le terminal.
Voici un nouvel exemple :
Regardez bien ce que nous avons fait. nom est une chaine de caractères. Donc, nous pouvons la concaténer à d'autres chaines de caractères, comme nous avons vu précédemment.
Dans un programme Ruby, seules les lignes passées à puts seront affichées à l'écran.
I-E-2. Un autre exemple▲
Souvenez-vous, dans la section précédente, nous avions entré ceci dans IRB :
Nous allons créer un nouveau programme Ruby à partir de ce code. Copiez simplement les lignes dans un nouveau fichier, et rajoutez-y à la fin la ligne suivante :
puts y
Ensuite, sauvez le fichier et invoquez Ruby :
Ça fonctionne! Cependant, nous aimerions modifier un peu le message de sortie. L'idéal serait que le programme affiche «La réponse est 20» à l'écran. On peut toujours essayer ceci :
puts "La réponse est " + y # provoquera une erreur
Ça ne marchera évidemment pas. Pourquoi? Souvenez-vous, seules des chaines peuvent être concaténées à d'autres chaines. Nous devons donc convertir notre entier y en chaine de caractères. Nous savons qu'il faut utiliser la méthode Integer#to_s.
I-E-3. Créer des programmes exécutables▲
Si vous travaillez sur un système compatible UNIX (Linux, *BSD, Solaris, Cygwin + Win32…), vous pouvez rendre vos programmes Ruby exécutables. Ils pourront donc être démarrés de la même façon que les autres programmes.
Premièrement, nous devons savoir où se cache Ruby sur votre machine. Pour ce faire, entrez la commande which ruby dans un terminal :
Recopiez le chemin sur la toute première ligne de votre programme. N'oubliez pas de préfixer la ligne par #!.
Il ne reste plus qu'à spécifier l'attribut du programme, ce que fera la commande chmod +x prog.rb (+x signifie «exécutable») :
I-E-4. Quelques exercices▲
Transformez en programme les exercices vus dans la section précédente.
Complétez le code suivant :
nom = "Laurent"
âge = 22
Le programme doit afficher « Laurent a 22 ans ».
I-F. Écrire de bons programmes▲
Beaucoup trop de tutoriels vous enseignent simplement comment programmer, sans vous apprendre comment faire de bons programmes.
I-F-1. Noms de variables▲
Voici certaines choses dont vous devriez tenir compte lors du choix des noms de variables.
I-F-1-a. Noms significatifs▲
Le nom d'une variable doit permettre de deviner le type de l'information contenue dans l'objet. Voici quelques exemples :
Bien |
Pas bien |
---|---|
age |
a |
etudiant |
foo |
nom |
xwy |
somme |
truc |
I-F-1-b. Noms composés▲
N'ayez surtout pas peur de choisir des noms de variables composés de plus d'un mot. Soyez simplement sûr que le nom de la variable est lisible.
Imaginez que vous désirez utiliser une variable pour enregistrer l'âge d'un étudiant. Il existe deux conventions :
- ageEtudiant ;
- age_etudiant.
Nous préférons la dernière possibilité. Mais c'est à vous de choisir.
N'écrivez pas ageetudiant. Vous n'auriez probablement pas apprécié si nous avions écrit ce tutoriel sans espacer les mots.
I-F-2. Travailler avec IRB▲
Vous ne devez pas arrêter d'utiliser IRB maintenant que vous savez comment utiliser votre éditeur pour écrire des programmes Ruby. Nous vous avons montré IRB tout au début pour une bonne raison. Lorsque vous programmerez avec Ruby, vous devriez toujours garder un terminal ouvert avec IRB, et y retourner pour expérimenter vos idées.
IRB a été conçu dans cette optique d'utilisation. Si vous l'utilisez judicieusement, vous deviendrez un bon programmeur Ruby.
I-F-3. Utiliser des constantes▲
Utilisez toujours des constantes pour représenter des valeurs fixes dans vos programmes. Il s'agit d'une bonne précaution, car Ruby vous aidera à identifier des erreurs potentielles dans votre code.
Quelques exemples :
Pi = 3.14159265
Masse_electron = 9.109e-31
Vitesse_lumiere = 3e8
Distance_terre_soleil = 5.79e10
Essayez également d'éviter d'écrire directement des valeurs numériques. Utilisez des constantes pour rendre votre code plus lisible. Par exemple, la formule pour calculer l'aire d'un cercle est la suivante :
aire = pi . r²
r = rayon
Votre code doit se rapprocher au maximum de la formule. Voici ce qu'il faut faire, et ce qu'il ne faut pas faire :
Bien |
Pas bien |
---|---|
PI = 3.14159265 aire = PI * (rayon ** 2) |
aire = 3.14159265 * (rayon ** 2) |