Rust : iterateurs

De Justine's wiki
Version datée du 6 décembre 2022 à 17:14 par Justine (discussion | contributions) (Page créée avec « = 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: <nowiki> 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... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

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