【问题标题】:How to make a reverse ordered for loop?如何进行反向排序的for循环?
【发布时间】:2014-08-06 21:00:37
【问题描述】:

编者注:这个问题是在 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?

【问题讨论】:

    标签: for-loop rust


    【解决方案1】:

    前向循环是这样的:

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

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

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

    【讨论】:

    • 在 rust 中,0..10 表示从 0 到 9,不包括 10。 (0..10).rev() 是指“10 到 1”还是“9 到 0”?
    • 括号有助于澄清这一点。范围将首先评估(0 到 9),然后反转(9 到 0)。
    【解决方案2】:

    编者注:这个问题指的是 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。

    【讨论】:

    • 那么为什么编译器不抱怨混合类型呢?
    • @user1452670:您没有混合类型,100u 的类型为 uint0-1 是编译器将推断的无类型积分一种。这里,range_step 需要统一参数并接收(uint, <untyped>, <untyped>),因此编译器推断它们都是uint。如果您有指定 0i-1i,那么您将遇到不匹配的情况。
    • @MatthieuM.:公平地说,-1 的值对于编译器是已知的,并且可以“推断”其类型为 uint 以产生警告,因为它不可表示。问题是,这是否是错误的频率。
    • @sellibitze:当然,非常欢迎使用 lint 来诊断超出范围的分配。
    猜你喜欢
    • 2014-09-29
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多