For loop 如何在生锈的情况下进行反向订购?

For loop 如何在生锈的情况下进行反向订购?,for-loop,rust,For Loop,Rust,编者按:这个问题是在Rust 1.0发布之前提出的,并且引入了。“range”操作符。问题的代码不再代表当前的样式,但下面的一些答案使用的代码将在Rust 1.0及更高版本中工作 我正在玩游戏,想把fizzbuzz倒过来打印出来。以下是我尝试过的: fn main() { // `n` will take the values: 1, 2, ..., 100 in each iteration for n in std::iter::range_step(100u, 0, -1)

编者按:这个问题是在Rust 1.0发布之前提出的,并且引入了
“range”操作符。问题的代码不再代表当前的样式,但下面的一些答案使用的代码将在Rust 1.0及更高版本中工作

我正在玩游戏,想把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.0之前的锈迹部分。查看其他答案以获取最新代码

您的代码不工作,因为值为-1的
uint
等于uint的最大值。检测到溢出后,范围_步迭代器立即停止。使用int可以解决这个问题

std::iter::range_step(100i, 0, -1)
还可以使用
rev()
反转迭代器


但是请注意,这将是从99->0开始的,而不是从100->1开始的。

前向循环如下所示:

for x in 0..100 {
    println!("{}", x);
}
通过调用以反转顺序来完成反向循环:

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

那么为什么编译器没有抱怨混合了类型?@user1452670:你没有混合类型,
100u
是类型
uint
0
-1
是编译器将推断类型的非类型积分。这里,
range\u步骤
需要统一的参数并接收
(uint,)
,因此编译器推断它们都是
uint
。如果您指定了
0i
,或
-1i
,则可能存在不匹配。@MatthieuM.:公平地说,
-1
的值是编译器已知的,可以“推断”其类型为
uint
,以产生警告,因为它不可表示。问题是,这是否是一个错误的频率。@sellibitze:当然,可以诊断超出范围的分配的lint是非常受欢迎的。@sellibitze:有一些。在rust中,0..10表示从0到9,10不包括在内。(0..10).rev()的意思是“10比1”还是“9比0”?括号有助于澄清这一点。首先计算范围(0到9),然后反向计算范围(9到0)。
for x in (0..100).rev() {
    println!("{}", x);
}