web-dev-qa-db-ja.com

Rustでforループを逆順にする方法は?

編集者注:この質問は、Rust 1.0がリリースされ、..「範囲」演算子が導入されました。質問のコードは現在のスタイルを表していませんが、以下の回答ではRust 1.0以降で動作するコードを使用しています。

Rust by ExampleのWebサイト で遊んでいて、逆に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に反復するにはどうすればよいですか?

37
Tybalt

編集者注:この質問は、Rust that predate Rust 1.0。最新のコードについては他の回答をご覧ください。

値-1のuintはuintの最大値に等しいため、コードは機能しません。 range_stepイテレータは、オーバーフローを検出するとすぐに停止します。 intを使用すると、これが修正されます。

_std::iter::range_step(100i, 0, -1)
_

rev()でイテレータを逆にすることもできます。

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

ただし、これは100-> 1ではなく99-> 0であることに注意してください。

22
A.B.

フォワードループは次のようなものです。

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

そして、逆ループは Iterator::rev 順序を逆にする:

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