如何在Rust中对循环进行反向排序?

时间:2014-08-06 21:00:37

标签: for-loop rust

  

编者注:在Rust 1.0发布之前询问了这个问题并引入了..“range”运算符。问题的代码不再代表当前的样式,但下面的一些答案使用的代码可以在Rust 1.0及以后版本中使用。

我正在Rust by Example website上玩,并希望反过来打印出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?

2 个答案:

答案 0 :(得分:73)

正向循环是这样的:

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

通过调用Iterator::rev来反转顺序来完成反向循环:

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

答案 1 :(得分:19)

  

编者注:这个问题是指在Rust 1.0之前的Rust部分。查看最新代码的其他答案。

您的代码不起作用,因为值{-1}的uint等于uint的最大值。检测到溢出后,range_step迭代器立即停止。使用int修复此问题。

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

您还可以使用rev()反转迭代器。

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

虽然请注意这将是99-> 0,而不是100-> 1.