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

Tyb*_*alt 39 for-loop rust

编者注:在Rust 1.0发布之前询问了这个问题..并引入了"范围"操作符.问题的代码不再代表当前的样式,但下面的一些答案使用的代码可以在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

没有编译错误,但它没有打印出任何东西.如何从100迭代到1?

Lux*_*pes 90

前向循环是这样的:

for x in 0..100 {
    println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)

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

for x in (0..100).rev() {
    println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)

  • 括号有助于澄清这一点。将首先评估范围(0 到 9),然后反转(9 到 0)。 (8认同)
  • 在 Rust 中,0..10 表示从 0 到 9,不包括 10。那么 (0..10).rev() 意味着“10 比 1”还是“9 比 0”? (6认同)

A.B*_*.B. 25

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

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

std::iter::range_step(100i, 0, -1)
Run Code Online (Sandbox Code Playgroud)

您也可以使用反转迭代器rev().

for n in range(0u, 100).rev() { ... }
Run Code Online (Sandbox Code Playgroud)

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

  • @user1452670:您没有混合类型,“100u”是“uint”类型,“0”和“-1”是编译器将“推断”类型的无类型整数。这里,“range_step”需要统一参数并接收“(uint, <untyped>, <untyped>)”,因此编译器推断它们都是“uint”。如果您“指定”了“0i”或“-1i”,那么您就会遇到不匹配的情况。 (3认同)
  • 那么为什么编译器不会抱怨混合类型呢? (2认同)
  • @MatthieuM.:公平地说,编译器知道`-1`的值,并且"推断"它的类型是'uint`可以产生警告,因为它不可表示.问题是,这是多少次错误. (2认同)