Как сделать обратный порядок для цикла в 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?
Ответы
Ответ 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);
}