Rust : iterateurs
Itérateurs
Ce sont des objets permettant d'itérer sur, par exemple, un vecteur (ou autre).
Je ne vais pas réécrire le rust book, mais on peut créer un itérateur à partir d'un vecteur et l'utiliser:
fn iterator_demonstration() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); assert_eq!(v1_iter.next(), Some(&1)); assert_eq!(v1_iter.next(), Some(&2)); assert_eq!(v1_iter.next(), Some(&3)); assert_eq!(v1_iter.next(), None); }
Un itérateur, c'est tout simplement un struct avec un méthode "next". Ici, j'en créée un à partir de mon Vecteur. Le next() n'est pas intuitif:
- Mon itérateur commence case 0.
- Je fais next() : il renvoie Some(le contenu) ou None si c'est vide
- Il avance à la case suivante.
Il garde sa case en permanence. On peut le visualiser comme une tête de lecture sur une bande, qui avance case par case (comme dans une Turing Machine).
peekable
C'est sympa, mais si je veux connaître la suite, je suis obligée de faire avancer mon itérateur (ma tête de lecture) : c'est parfois embêtant.
Je peux faire un itérateur "peekable", qui va me permettre de "peek" la case suivante:
<nowiki>
fn main(){
let sequence = [1, 2, 3, 4]; //Je rend mon itérateur peekable avec peekable() let mut p = sequence.iter().peekable(); while let Some(n) = p.next(){ println!("Value from iterator: {}", n); //Je peux peek() println!("Peeking for next value: {:?}", p.peek()); println!("Peeking again, but it's still: {:?}", p.peek()); }
} <nowiki>
Tout comme next(), peek renvoie un Some() / None