Recherche…
Syntaxe
loop { block } // boucle infinie
tandis que condition { bloc }
while let pattern = expr { bloc }
pour pattern dans expr { block } // expr doit implémenter IntoIterator
continue // saut à la fin du corps de la boucle, commence une nouvelle itération si nécessaire
pause // arrête la boucle
' label : loop { block }
' label : while condition { block }
' label : while let pattern = expr { bloc }
' label : pour le pattern dans expr { block }
continuer label // saut à la fin du corps de la boucle étiquette marquée, le démarrage d' une nouvelle itération si nécessaire
break ' label // arrête l' étiquette libellée de la boucle
Les bases
Il y a 4 constructions en boucle dans Rust. Tous les exemples ci-dessous produisent la même sortie.
Boucles infinies
let mut x = 0;
loop {
if x > 3 { break; }
println!("{}", x);
x += 1;
}
Pendant que les boucles
let mut x = 0;
while x <= 3 {
println!("{}", x);
x += 1;
}
Voir aussi: Quelle est la différence entre loop
et while true
?
Boucles de motifs assorties
Celles-ci sont parfois connues sous le nom de « while let
, pour des raisons de brièveté.
let mut x = Some(0);
while let Some(v) = x {
println!("{}", v);
x = if v < 3 { Some(v + 1) }
else { None };
}
Ceci est équivalent à une match
dans un bloc de loop
:
let mut x = Some(0);
loop {
match x {
Some(v) => {
println!("{}", v);
x = if v < 3 { Some(v + 1) }
else { None };
}
_ => break,
}
}
Pour les boucles
Dans Rust, for
loop ne peut être utilisé qu'avec un objet "itérable" (c'est-à-dire qu'il doit implémenter IntoIterator
).
for x in 0..4 {
println!("{}", x);
}
Cela équivaut à l'extrait de code suivant impliquant while let
:
let mut iter = (0..4).into_iter();
while let Some(v) = iter.next() {
println!("{}", v);
}
Remarque: 0..4
renvoie un objet Range
qui implémente déjà le trait Iterator
. Par conséquent, into_iter()
est inutile, mais est conservé pour illustrer ce for
fait. Pour un regard en profondeur, voir les documents officiels sur for
boucles et IntoIterator
.
Voir aussi: Itérateurs
En savoir plus sur les boucles
Comme mentionné dans Basics, nous pouvons utiliser tout ce qui implémente IntoIterator
avec la boucle for
:
let vector = vec!["foo", "bar", "baz"]; // vectors implement IntoIterator
for val in vector {
println!("{}", val);
}
Production attendue:
foo
bar
baz
Notez que l'itération sur vector
de cette manière la consomme (après la boucle for
, le vector
ne peut plus être utilisé). En effet , IntoIterator::into_iter
se déplace self
.
IntoIterator
est également implémenté par &Vec<T>
et &mut Vec<T>
(produisant des valeurs avec les types &T
et &mut T
respectivement), vous pouvez donc empêcher le déplacement du vector
en le faisant simplement passer par référence:
let vector = vec!["foo", "bar", "baz"];
for val in &vector {
println!("{}", val);
}
println!("{:?}", vector);
Notez que val
est de type &&str
, puisque le vector
est de type Vec<&str>
.
Contrôle de boucle
Toutes les constructions en boucle permettent l'utilisation d'instructions break
et continue
. Ils affectent la boucle immédiatement environnante (la plus interne).
Contrôle de boucle de base
break
termine la boucle:
for x in 0..5 {
if x > 2 { break; }
println!("{}", x);
}
Sortie 0
1
2
continue
finit l'itération en cours tôt
for x in 0..5 {
if x < 2 { continue; }
println!("{}", x);
}
Sortie 2
3
4
Contrôle de boucle avancé
Maintenant, supposons que nous avons des boucles imbriquées et que vous voulez break
vers la boucle extérieure. Ensuite, nous pouvons utiliser des étiquettes de boucle pour spécifier à quelle boucle une break
ou une continue
s'applique. Dans l'exemple suivant, 'outer
est l'étiquette donnée à la boucle externe.
'outer: for i in 0..4 {
for j in i..i+2 {
println!("{} {}", i, j);
if i > 1 {
continue 'outer;
}
}
println!("--");
}
Sortie 0 0
0 1
--
1 1
1 2
--
2 2
3 3
Pour i > 1
, la boucle interne n'a été itérée qu'une seule fois et --
n'a pas été imprimée.
Remarque: Ne confondez pas une étiquette de boucle avec une variable de durée de vie. Les variables de durée de vie apparaissent uniquement à côté d'un paramètre &
ou en tant que paramètre générique dans <>
.