12 votes

Est-il possible de concaténer des itérateurs?

let vec = iter::repeat("ne satisfait pas la condition 1") // itérateur tel que next() ne satisfait toujours pas la condition 1
    .take_while(|_| {
        satisfaire_condition1.satisfaire() // vrai si la condition 1 est satisfaite sinon faux
    })
    .collect();

Ce code crée un vecteur de n éléments avec n égal au nombre de fois où la condition 1 n'est pas respectée.

J'aimerais maintenant créer un vecteur de n + m éléments avec n égal au nombre de fois où la condition 1 n'est pas respectée et m le nombre de fois où la condition 2 n'est pas respectée.

Le code devrait ressembler à ceci :

let vec = iter::repeat("ne satisfait pas la condition 1")
    .take_while(|_| {
        satisfaire_condition1.satisfaire() 
    })
    .union(
        iter::repeat("a satisfait la condition 1 mais pas encore la 2")
        .take_while(|_| {
            satisfaire_condition2.satisfaire() 
        })
    )
    .collect();

Je sais que je pourrais créer deux vecteurs et les concaténer mais c'est moins efficace.

Vous pouvez utiliser ce code pour comprendre ce que fait la fonction repeat :

use std::iter;

fn main() {
    let mut c = 0;
    let z: Vec<_> = iter::repeat("ne satisfait pas la condition 1")
        .take_while(|_| {
            c = c + 1;
            let rep = if c < 5 { true } else { false };
            rep
        })
        .collect();
    println!("------{:?}", z);
}

19voto

SCappella Points 7821

Il semble que std::iter::chain est ce que vous recherchez.

use std::iter;

fn main() {
    let mut c = 0;
    let mut d = 5;
    let z: Vec<_> = iter::repeat("don't satisfy condition 1")
        .take_while(|_| {
            c = c + 1;
            let rep = if c < 5 { true } else { false };
            rep
            // this block can be simplified to
            // c += 1;
            // c < 5
            // Clippy warns about this
        })
        .chain(
            iter::repeat("satisfy condition 1 but not 2").take_while(|_| {
                d -= 1;
                d > 2
            }),
        )
        .collect();
    println!("------{:?}", z);
}

(lien vers le playground)

Je ne peux pas commenter sur la sémantique de votre code, cependant. Si vous essayez de voir quels éléments d'un itérateur "satisfont la condition 1 mais pas la 2", ce n'est pas ainsi que vous le feriez. Vous utiliseriez std::iter::filter deux fois (une fois avec la condition 1 et une fois sans la condition 2) pour y parvenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X