« Programmation Ruby/Contrôle » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Retry : +interwiki zh:
Formulation + ortho + Mef
Ligne 3 :
== Expressions booléennes ==
 
Une expression booléenne est toute expression qui renvoirenvoie après évaluation vrai (<tt>true</tt>) ou faux (<tt>false</tt>).
vraiUne valeur booléenne peut être de type booléen (''<tt>true''</tt> ou ''<tt>false''</tt>), mais en pratique les conditions peuvent également utiliser une valeur entière (''0'' pour faux, ''1'' pour vrai), ou tout simplement non nul (''<tt>nil''</tt> pour faux, une autre valeur pour vrai).
 
Ruby se veut objet, et de ce fait les opérateurs décrit ci-dessous, sont en réalités des méthodes d'instance. Cela signifie que le développeur devra implémenter lui même ces méthodes. Néanmoins certaines d'entre elle sont définies dans ''Object''la quiclasse est<tt>Object</tt>, parentemère de toutes les autres classes, ou encore dans un module. Nous reviendrons sur ces concepts dans le chapitre traitant de la programmation objet.
 
Les exemples ici utilisent des objets "standards" pour un souci de clarté, ils peuvent être remplacés par des expressions placésplacées entre parenthèses.
Ainsi :
42 == 42 => true
Ligne 16 :
=== defined? ===
 
''<tt>defined?''</tt> permet de vérifier l'éxistenceexistence d'une variable, l'opérateur renvoirenvoie ''<tt>nil''</tt> si la variable n'existe pas, sinon renvoi une déscriptiondescription :
 
defined? 42 => "expression"
Ligne 26 :
=== eql? ===
 
''<tt>eql?''</tt> teste si deux variables sont du même type, renvoi ''<tt>true''</tt> si c'est le cas, sinon ''<tt>false''</tt>.
 
42.eql?(18) => true
42.eql?(42.0) => false #En effet 42 est un entier, 42.0 un flotantflottant
 
=== equal? ===
 
''<tt>equal?''</tt> renvoirenvoie ''<tt>true''</tt> si les deux objets comparés sont en réalité un même objet (même id), sinon renvoirenvoie ''<tt>false''</tt>.
 
a = "mon objet"
Ligne 44 :
=== == ===
 
''<tt>==''</tt> permet de tester l'égalité entre les valeurs de deux éléments :
 
42 == 42 => true
Ligne 52 :
=== != ===
 
''<tt>!=''</tt> permet de tester l'inégalité entre les valeurs de deux éléments :
 
42 != 42 => false
Ligne 60 :
=== <=> ===
 
''<tt>&lt;=&gt;</tt>'' sert à comparer deux variables, cette méthode n'est pas à proprement parlé un opérateur booléen. En effet celle-ci renvoie ''<tt>-1''</tt>, ''<tt>0''</tt> ou ''<tt>1''</tt> si, le premier élément est respectivement inférieur, égal ou supérieur au second, et renvoie ''<tt>nil''</tt> si les types sont différents.
 
2 <=> 2 => 0
Ligne 67 :
42 <=> "42" => nil
42 <=> 42.0 => 0 # contrairement à eql?, c'est la valeur qui est comparée
 
Pour deux valeurs numériques cet opérateur retourne donc le signe de la différence entre celles-ci.
 
=== < et <= ===
 
''<''tt>&lt;</tt> et ''<tt>&lt;=''</tt> correspondent respectivement à "inférieur" et "inférieur ou égal à" :
 
42 < 43 => true
42 < 42 => false
42 <= 42 => true
"abcdef" < "abzd" => true #la comparaison entre chaineschaînes de caractères se fait lettre à lettre
"abzd" < "abcdef" => false
 
=== > et >= ===
 
''<tt>&gt;</tt>'' et ''<tt>&gt;=''</tt> correspondent respectivement à "supérieur à" et "supérieur ou égal à" :
 
42 > 43 => false
42 > 42 => true
42 >= 42 => true
"abcdef" > "abzd" => false #la comparaison entre chaineschaînes de caractères se fait lettre à lettre
"abzd" > "abcdef" => true
 
=== not et ! ===
 
''<tt>not''</tt> et ''<tt>!''</tt> exprime la négation, l'opérarateuropérateur "inverse" l'élément placé juste après, ainsi :
ainsi :
 
not true => false
(!false) => true
 
deDe même, on peut exprimer la négation sur une expression si celle-ci se trouve entre paranthèsesparenthèses :
 
(!(2 < 10)) => false
Ligne 103 ⟶ 104 :
=== and et && ===
 
''<tt>and''</tt> et ''<tt>&amp;&''amp;</tt> correspondent au "et logique" :
 
true and false => false
true and true => true
 
Dans un souci d'optimisation, rubyRuby teste la première expression, et si celle-ci est fausse, il teste ensuite la seconde
 
=== or et || ===
 
''<tt>or''</tt> et ''<tt>||''</tt> correspondent au "ou logique"
 
true or false => true
Ligne 120 ⟶ 121 :
== Les expressions conditionnelles ==
 
Une expression conditionnelle sert à réagir en fonction d'un élementélément donné.
 
=== Expression IF...THEN...ELSE ===
Ligne 235 ⟶ 236 :
== Les boucles et les itérateurs ==
 
Les boucles et itérateurs permetentpermettent de parcourir une liste d'éléments, ou d'effectuer une action tant qu'une condition est respectée.
 
=== While/Until ===
Ligne 267 ⟶ 268 :
4
 
Dans cet éxempleexemple l'expression conditionelleconditionnelle est évaluée avant l'évaluation du corps de la boucle, donc si i avait été égal à 6, le contenu de la boucle n'aurait jamais été évalué. Néanmoins nous pouvons utiliser une autre construction commençant par un bloc et suivit de ''while'', dans ce cas là le corps de la boucle est évalué au moins une fois :
i = 12
Ligne 294 ⟶ 295 :
=== loop ===
 
''loop'' ressemble à la structure while, mais ne prend pas d'expression conditionelleconditionnelle. En fait ''loop'' correspond à
while(true)
Le seul moyen de quitter la boucle est d'utiliser l'instruction break :
Ligne 331 ⟶ 332 :
end
 
Pour les chaineschaînes de caractères, le retour chariot servira de séparateur :
for ligne in "première\ndeuxième\ntroisième"
puts ligne
Ligne 352 ⟶ 353 :
 
=== each_byte et each_line ===
Les chaineschaînes de caractères ont une méthode spécifique appelléeappelée each_byte (chaque caractère) qui parcours la chaîne caractère par caractère :
 
"abcdef".each_byte{ |caractere| printf "%c\n", caractere }
Ligne 363 ⟶ 364 :
 
Et '''each_line''' (chaque ligne) qui parcoure les lignes séparés par le retour chariot :
["premierepremière", "suite", "autre"].join("\n").each_line{|ligne| puts ligne}
=> premierepremière
suite
autre
Ligne 370 ⟶ 371 :
=== times ===
 
Fonction typique à Ruby, la méthode d'itération des classes d'entiers noméenommée '''times''' (fois) et qui peut être utilisé avec les constantes numériques (ce languagelangage étant en purepur objet) :
 
3.times{puts "texte"}
Ligne 385 ⟶ 386 :
 
=== Boucles implicites ===
Le parcours des éléments d'un tableau dans rubyRuby est implicite lorsque on l'utilise comme variable d'assignementassignation, comme c'est le cas pour les chaineschaînes de caractère dans la majorité des langages :
 
puts [ "élément 1", "élément 2", "élément 3" ]
Ligne 392 ⟶ 393 :
élément 3
 
On peut de la mememême façon extraire une partie d'un tableau simplement sans avoir à créer de boucle qui parcoure tous les éléments.
 
Exemple tiré du site officiel de Ruby
Ligne 414 ⟶ 415 :
=== Break ===
 
Nous avons déjà vu ''break'' qui permet d'interrompre l'éxécutionexécution d'une boucle :
 
i = 0
Ligne 430 ⟶ 431 :
=== Redo ===
 
''redo'' va réevaluerréévaluer le corps de la boucle, mais sans retester la condition, et sans utiliser l'élément suivant (dans un itérateur)
for i in 1..4
print "#{i} "
Ligne 443 ⟶ 444 :
3 3
4 4
La variable i étant définie localement (dans la boucle), cela ne change pas le déroulement par rapport à la liste globale, mais la variable est bien vue comme ayant une valeur différente de 2 ala seconde fois et le redo est évité. Le puts suivant le redo dans le bloc de code de la boucle n'est pas exécuté lorsque celui est executéexécuté.
 
=== Next ===
 
''next'' va aller à la fin de la boucle, puis recommecerrecommencer l'itération avec l'élément suivant dans le cas d'un itérateur :
 
i=0
Ligne 475 ⟶ 476 :
...
 
onOn rentreentre ici dans une boucle infinie.
 
[[en:Ruby Programming/Syntax/Control Structures]]