Ruby/Conditions
Jusque-là, nos programmes étaient monotones, linéaires, ils fonctionnaient toujours de la même façon. Or, dans la plupart des cas, on a besoin d'adapter le déroulement du programme en fonction de certains paramètres (une action de l'utilisateur, etc.). Voilà pourquoi nous avons recours aux structures conditionnelles.
La condition if - else
modifier
La structure en if - else
est la plus simple des structures conditionnelles. Elle évalue une expression, si (if
) cette condition est remplie, certaines instructions sont exécutées, sinon (else
) on en exécute d'autres.
Une structure conditionnelle se termine par le mot-clé end
. Celui-ci se situe après la dernière condition.
Nous ne sommes pas obligés de placer un else
dans la condition ; par exemple, ceci fonctionne :
Les parenthèses entre lesquelles se situe la condition sont facultatives.
Si la condition entre parenthèses est vérifiée, l'état true
lui est assigné : le cas échéant, ce sera la valeur false
. Comme nous l'avons déjà vu, vous pouvez aussi assigner ces valeurs booléennes à des variables.
Le mot-clé then
est facultatif si la condition est suivie d'un retour à la ligne, mais il améliore la lisibilité de la condition :
if(age >= 18) then puts "vous êtes majeur" # ici, then est obligatoire
else puts "vous êtes mineur"
end
if(age >= 18) # retour à la ligne
puts "vous êtes majeur" # ici, then est facultatif
else puts "vous êtes mineur"
end
Afin de tester ce genre d'expression arithmétique, vous disposez des opérateurs suivants :
- == vérifie l'égalité du premier terme par rapport au second (à ne pas confondre avec le symbole d'affectation : =)
- < vérifie que le premier terme est strictement inférieur au second
- > vérifie que le premier terme est strictement supérieur au second
- <= vérifie que le premier terme est inférieur ou égal au second
- >= vérifie que le premier terme est supérieur ou égal au second
- != vérifie l'inégalité du premier terme par rapport au second
Considérons maintenant :
estMajeur = false
if (estMajeur)
then puts "Vous êtes majeur"
else puts "Vous êtes mineur"
end
La valeur true
se déduit d'elle-même : vous n'avez pas besoin d'écrire if(estMajeur == true)
. Pour tester la valeur false
, on aurait pu écrire if(estMajeur == false)
, mais ceci fonctionne aussi : if!(estMajeur)
.
Il existe une autre façon d’utiliser la condition if
:
Dans ce cas, l'instruction à exécuter doit être la seule ; on ne s'encombre pas d'un end
final.
Condition alternative : elsif
modifier
La condition vue précédemment peut être davantage enrichie, des choix intermédiaires peuvent être proposés, par test de plusieurs conditions successives (si... alors... sinon si... alors... sinon...). La première condition vérifiée comme étant vraie sera exécutée, les autres seront alors ignorées (même si elles sont vraies, elles aussi).
a = 5 ; b = 4 ; c = 7
if (a < b) # false
#
elsif (a < c) # true
#
elsif (b < c) # true
#
else
#
end
(a < b)
est fausse : les instructions suivant leif
ne sont donc pas exécutées.(a < c)
est vraie : donc les instructions suivant le premierelsif
sont exécutées, on sort ensuite de la structure conditionnelle.- Les instructions du second
elsif
et duelse
ne sont pas exécutées, même si(b < c)
est vraie.
Les autres remarques faites précédemment sont encore valables ici.
La condition unless
modifierunless
est la condition contraire de if
. Elle exécute une instruction sauf si la condition est vérifiée. Par exemple :
unless(estMajeur)
effectue la même chose que if!(estMajeur)
, utilisez la condition que vous préférez.
Tout comme avec l'instruction if
, il est possible d'écrire :
L'instruction case
modifierCette instruction teste une suite de conditions : elle évalue plusieurs cas et exécute certaines instructions en conséquence (la première condition vérifiée masque les autres, comme dans les structures en if
). Voici comment l’utiliser :
z = 4
case z
when 1 # dans le cas où z = 1
print "z = 1"
when "maison" # dans le cas ou z est la chaîne "maison"
print "z = 'maison'"
when z = 4
print "z = 4"
end
On teste ici différents cas en fonction de la valeur de z
. when 1
équivaut implicitement à when z = 1
. Cette structure case
se termine là aussi par un end
.
Condition ternaire
modifierIl existe encore une autre solution pour évaluer une expression booléenne, elle fonctionne suivant ce schéma :
condition ? (si vrai) : (sinon)
Un exemple :
a est inférieur à b, donc (a < b)
est vraie et l’expression à gauche des deux-points est exécutée ; si (a < b)
avait eu la valeur false
, on aurait exécuté l’expression à la droite des deux-points.
Associations de conditions
modifierSi votre programme a un comportement complexe basé sur des combinaisons de conditions, il se peut que vous ayez à écrire quelque chose de ce genre :
Il existe un moyen de simplifier ce genre de conditions multiples, on peut tester deux conditions (ou plus) à la fois de cette manière :
On peut aussi s'assurer qu'au moins une des conditions est vérifiée :
Il suffit que (a < b)
ou (c > a)
soit vraie (ou les deux) pour que (a < b || c > a)
soit vraie.
Vous pouvez modifier l’ordre des priorités en regroupant certaines conditions entre parenthèses, comme pour les opérations arithmétiques.
Pour améliorer la lisibilité du code, il est possible de remplacer &&
par le mot-clé and
et ||
par or
.
Ici, nous n'avons considéré que deux conditions, mais vous pouvez en combiner autant que vous voulez.