Conditions

Dans Ruby, il est possible d'effectuer plusieurs actions en fonction d'une série de conditions, en utilisant le mot magique if. Voici un exemple:

1
if ville == "Toronto"
    age_legal_alcool = 19
2
else
    age_legal_alcool = 21
end

Ce qui veut dire:

1

Si (if) le contenu de la variable ville est égale à (==) la chaîne "Toronto", alors nous affectons à la variable age_legal_alcool le nombre 19.

2

Sinon (else), nous affectons à la variable age_legal_alcool le nombre 21.

Ruby permet de distinguer deux états différents d'une expression:

Le meilleur moyen d'illustrer cette théorie est d'expérimenter quelques exemples. Comme toujours, démarrez IRB et entrez les commandes suivantes:

L'instruction if évalue si une expression quelconque (par exemple, ville == "Toronto") est soit vraie (true), soit fausse (false) et ensuite agit en conséquence.

[Warning]Avertissement

Notez bien la différence entre les opérateurs = et ==:

  • = est un opérateur d'affectation (il permet d'assigner une valeur à une variable)

  • == est un opérateur de comparaison (il permet de comparer l'état de deux expressions)

Voici une liste regroupant la plupart des opérateurs conditionnels:

Comment ces opérateurs se comportent-ils avec des chaînes de caractères? L'opérateur == vérifie si deux chaînes sont exactement identiques. Les autres opérateurs se basent sur la table ASCII pour produire et renvoyer un état de comparaison.

[Note]Note

Qu'est-ce que cette table ASCII? Il s'agit d'une table contenant tous les caractères pouvant être générés par le clavier. Ces caractères sont triés dans cet ordre:

  1. d'abord les chiffres (012...789)

  2. ensuite les lettres majuscules (ABC...XYZ)

  3. et finalement les lettres minuscules (abc...xyz)

[Note] Note du traducteur

ASCII: « American Standard Code for Information Interchange ». Ce code permet d'échanger des informations entre des ordinateurs construits par différentes entreprises. Il a été conçu pour la langue anglaise à la base. Néanmoins, il ne convient pas pour les autres langues utilisant des caractères spéciaux (comme le japonais, par exemple). Pour remédier à ce problème, Ruby utilise un système d'encodage nommé UTF8, qui permet de combiner des caractères ASCII (codés sur un octet) et des symboles spéciaux (codés sur deux octets).

Maintenant, démarrez IRB et entrez ceci:

[Tip]Astuce

Avez-vous remarqué comment IRB peut clarifier les choses? Vous devriez vous habituer à essayer d'abord certaines idées dans IRB. C'est un outil génial, utilisez-le!

L'instruction elsif vous permet de rajouter plus d'une condition dans votre expression. Prenez ceci par exemple:

1
if age >= 60
    puts "Prix senior"
2
elsif age >= 14
    puts "Prix adulte"
3
elsif age >= 2
    puts "Prix enfant"
4
else
    puts "Gratuit!"
end

Essayons de comprendre ceci:

1

Si la variable age contient une valeur plus grande ou égale à 60, nous donnons un prix senior.

2

Si ce n'est pas vrai, mais que age est plus grand ou égal à 14, nous donnons un prix adulte.

3

Si ce n'est pas vrai, mais que age est plus grand que 2, nous donnons un prix enfant.

4

Sinon, c'est gratuit!

Ruby exécutera cette séquence de conditions une par une. Uniquement la première condition vraie sera exécutée. Vous pouvez rajouter autant de elsif que vous désirez.

Pour rendre les choses plus simple à comprendre, nous allons rajouter ces conditions dans un programme. Il devra demander l'age de l'utilisateur, et ensuite afficher le prix correspondant à cet age:

Ce programme devrait se comporter comme ceci:

[Warning]Avertissement

Soyez bien conscient de l'ordre dans lequel vous rajoutez vos conditions avec elsif. Seulement le code associé à la première condition évaluée comme étant «vraie» sera exécuté. Cet exemple illustre bien ce danger:

age = 21

if age > 5
   puts "Plus vieux que 5 ans"
elsif age > 10
   puts "Plus vieux que 10 ans"
elsif age > 20
   puts "Plus vieux que 20 ans"   
elsif age > 30
   puts "Plus vieux que 30 ans"
end

En lisant ce code rapidement, il semblerait logique que le programme affiche "Plus vieux que 20 ans" à l'écran. Il n'en est rien! Comme dit plus haut, seule la première condition valide remporte la mise. Le programme affichera "Plus vieux que 5 ans".

Voici la bonne méthode à utiliser:

age = 21

if age > 30
   puts "Plus vieux que 30 ans"   
elsif age > 20
   puts "Plus vieux que 20 ans"   
elsif age > 10
   puts "Plus vieux que 10 ans"   
elsif age > 5
   puts "Plus vieux que 5 ans"   
end