4

这个问题使用早于 Rust 1.0 的语法,但概念是通用的,并且许多答案已更新以反映稳定的 Rust 1.0。

这个问题是关于程序员在学习 Rust 时可能会尝试的一个非常基本的事情。

你不能问一个关于 Rust 语言的简单问题,我不认为,但我是一个有 30 年经验的程序员,我想不通。

我认为这int::range与闭包有关。

这是我在 Rust 的早期版本(1.0 之前)中写的。

fn main() {
    int::range(0, 100, {|i| 
        io::println(i);
    });
}

这会产生可爱的错误消息,我不知道如何修复:

hello.rs:3:19: 5:2 error: mismatched types: expected `&fn(int) -> bool` but found `()` (expected fn but found ())
hello.rs:3 int::range(0, 100, {|i| 
hello.rs:4     io::println(i);
hello.rs:5 });

它是如何打印出我的整个函数体的,这很有趣,但我仍然不知道那是&fn(int) ->b ool什么意思。我隐约怀疑,在 Rust 中明确不允许迭代器闭包的主体不声明任何返回类型,这让我感到困惑。

4

2 回答 2

11

Rust 肯定已经走了很长一段路!在 Rust 1.0 中,范围有一些语法糖start..end,并实现了Iteratortrait。结合在一起,你可以说:

fn main() {
    for i in 0..100 {
        println!("{}", i);
    }
}

从 Rust 1.26 开始,您还可以使用包含范围:

fn main() {
    for i in 0..=99 {
        println!("{}", i);
    }
}

也可以看看:

于 2015-05-23T14:57:16.753 回答
9

自发布此答案以来,Rust 1.0 发生了很大变化。今天像这样迭代的正确方法如下所示:

fn main() {
    for i in 0..99 {
        println!("{}", i);
    }
}

原答案:

int::range接受 a &fn(int) -> bool,这意味着一个接受 aint并返回 a的函数bool。您的函数不返回bool.

处理这个问题的典型方法是使用for句法构造,它将你的函数从一个返回的函数转换()为一个返回的函数bool,这允许它支持breakloop

for int::range(0, 100) |i| {
    io::println(fmt!("%d", i));
}

(另请注意,至少在 Rust 0.6 中,函数的正确语法是将 放在|i|之前{


Rust 中高阶迭代函数的工作方式是使用bool返回值来确定它是否应该继续迭代。返回值true表示继续迭代,返回值false表示停止迭代。该for构造将重写函数以翻译breakloop转换为适当的返回语句。将被break翻译return false成. 它还将语句转换为从循环外部对临时标志变量的修改(后跟 a ),然后在迭代函数完成后查询该变量以确定它是否应该从外部函数返回。loopreturn truereturnreturn false

于 2013-04-27T18:42:44.310 回答