Подтвердить что ты не робот

Как сделать обратный порядок для цикла в Rust?

Примечание редактора: этот вопрос задавали до того, как был выпущен Rust 1.0, и был введен оператор .. "range". Код вопроса больше не отражает текущий стиль, но в некоторых ответах ниже используется код, который будет работать в Rust 1.0 и далее.

Я играл на странице Rust by Example и хотел распечатать fizzbuzz в обратном порядке. Вот что я пробовал:

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);
        }
    }
}

Ошибок компиляции не было, но ничего не распечатало. Как перебирать от 100 до 1?

4b9b3361

Ответ 1

Примечание редактора: Этот вопрос относится к частям ржавчины, которые предшествуют Rust 1.0. Посмотрите другие ответы для актуального кода.

Ваш код не работает, потому что значение uint значения -1 равно максимальному значению uint. Итератор range_step останавливается сразу после обнаружения переполнения. Использование int исправляет это.

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

Вы также можете изменить итератор с помощью rev().

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

Обратите внимание, что это будет от 99- > 0, а не 100- > 1.

Ответ 2

Прямой контур выглядит так:

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

И обратный цикл выполняется путем вызова Iterator::rev, чтобы отменить порядок:

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