首页 > 解决方案 > Rust 闭包真的不需要类型注解吗?

问题描述

我目前正在阅读 Rust 书,我刚刚达到了主题closures。令我惊讶的一个细节是,Rust 书说

闭包不需要你注释参数的类型

我立即对此进行了测试,因为它看起来与 Rust 通常的工作方式非常违反直觉。因此,我完全复制了他们使用的闭包,将其粘贴到我的代码中,然后……出现错误:

fn some_closure() {
    let expensive_closure = |num| {
        println!("calculating slowly...");
        thread::sleep(Duration::from_secs(2));
        num
    };
}
error[E0282]: type annotations needed
  --> src/main.rs:14:30
   |
14 |     let expensive_closure = |num| {
   |                              ^^^ consider giving this closure parameter a type

error: aborting due to previous error

我确实知道该错误的含义,但我仍然对此感到困惑,因为不仅书本,而且参考资料都指定不需要注释,但我收到了这个错误。

这只是最近尚未记录的更改,还是我误解了什么?

标签: rustclosures

解决方案


这本书,而且参考指定不需要注释,但我收到了这个错误。

不,书的关键词和参考文献是必填项,与需要不同。即使通常不需要某些内容,也可以根据上下文需要。

对于闭包,区别与“静态函数”(fn)相反,注释是语法要求:如果不提供类型注释,您不能编写有效的静态函数,而一般来说,您可以编写不带类型注释的闭包。

但是编译器仍然需要知道闭包的具体类型,这需要能够推断参数和返回类型。如果因为没有足够的约束而不能,它会抱怨并需要明确指定的类型。

在您的示例中,没有任何限制 of 的类型num,因此 rustc 无法知道具体的类型num是什么,因此无法推断出闭包的具体类型应该是什么。

但在大多数情况下,例如

let it = repeat(5).map(|x| x+1);

编译器对此很满意,因为闭包的输入和输出类型必然是map提供的,即Repeat::Item,在这种情况下是i32(因为这是整数文字默认禁止其他约束的内容)。


推荐阅读