web-dev-qa-db-fra.com

Comment faire une boucle inversée pour Rust?

Note de l'éditeur: cette question a été posée avant Rust 1.0 a été publié et le .. L'opérateur "range" a été introduit. Le code de la question ne représente plus le style actuel, mais certaines réponses ci-dessous utilisent du code qui fonctionnera dans Rust 1.0 et versions ultérieures).

Je jouais sur le site Rust by Example et je voulais imprimer fizzbuzz à l'envers. Voici ce que j'ai essayé:

fn main() {
    // `n` will take the values: 1, 2, ..., 100 in each iteration
    for n in std::iter::range_step(100u, 0, -1) {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

Il n'y a pas eu d'erreurs de compilation, mais cela n'a rien imprimé. Comment puis-je itérer de 100 à 1?

37
Tybalt

Note de l'éditeur: cette question fait référence à des parties de Rust qui sont antérieures à Rust 1.0. Consultez les autres réponses pour obtenir un code à jour.).

Votre code ne fonctionne pas car un uint de valeur -1 est égal à la valeur maximale de uint. L'itérateur range_step s'arrête immédiatement lors de la détection d'un débordement. L'utilisation d'un int corrige cela.

std::iter::range_step(100i, 0, -1)

Vous pouvez également inverser un itérateur avec rev().

for n in range(0u, 100).rev() { ... }

Notez cependant que ce sera de 99-> 0, plutôt que 100-> 1.

22
A.B.

Une boucle directe est comme ceci:

for x in 0..100 {
    println!("{}", x);
}

Et une boucle inverse se fait en appelant Iterator::rev pour inverser l'ordre:

for x in (0..100).rev() {
    println!("{}", x);
}
83
Luxspes