Comment faire un inverse ordonné pour la boucle dans la rouille?

Note de L'Éditeur: cette question a été posée avant la sortie de Rust 1.0 et 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 au-delà.

Je jouais sur le site web 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 avait pas d'erreurs de compilation, mais il n'a rien imprimé. Comment faire Je itère de 100 à 1?

28
demandé sur Shepmaster 2014-08-07 01:00:37

2 réponses

Note de L'Éditeur: cette question fait référence à des parties de Rust antérieures à Rust 1.0. Regardez d'autres réponses pour le 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 après la détection du 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 99 - > 0, plutôt que 100 - > 1.

19
répondu A.B. 2018-01-10 03:42:46

Une boucle avant est comme ceci:

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

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

for x in (0..100).rev() {
    println!("{}", x);
}
51
répondu Luxspes 2017-11-13 23:52:04