C'est la fin de la partie gratuite... 😔
Accède à l’intégralité de la formation, à un Discord francophone actif, à des résumés écrits et à toutes les futures mises à jour pour seulement 95€ !
x
x
En comprenant les itérateurs on va comprendre pourquoi ce qu’on passe dans une boucle for est parfois move.
C’est le cas dans cet exemple :
fn main() {
let v = vec![String::from("a"), String::from("b")];
for x in v {
println!("{}", x);
println!("{}", v.len());
// erreur : car v a été déplacé à cause de 'for x in v'
}
}En réalité quand on utilise une boucle for rust va concrètement réécrire la boucle en utilisant des itérateurs sous le
capot.
Voici comment Rust réécrit les boucles for en fonction de ce sur quoi l’on itère,
| Syntaxe | Équivalent | Signature simplifiée | Comportement |
|---|---|---|---|
for x in v | v.into_iter() | fn into_iter(self) -> IntoIter<T> | move |
for x in &v | v.iter() | fn iter(&self) -> Iter<'_, T> | emprunt immuable |
for x in &mut v | v.iter_mut() | fn iter_mut(&mut self) -> IterMut<'_, T> | emprunt mutable |
En regardant les signatures, on peut vite comprendre que into_iter va faire un move (car elle prend self et pas &self) alors que iter et iter_mut n’en font pas.
C'est la fin de la partie gratuite... 😔
Accède à l’intégralité de la formation, à un Discord francophone actif, à des résumés écrits et à toutes les futures mises à jour pour seulement 95€ !