rust - 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
我确实知道该错误的含义,但我仍然对此感到困惑,因为不仅书本,而且参考资料都指定不需要注释,但我收到了这个错误。
这只是最近尚未记录的更改,还是我误解了什么?
解决方案
这本书,而且参考指定不需要注释,但我收到了这个错误。
不,书的关键词和参考文献是必填项,与需要不同。即使通常不需要某些内容,也可以根据上下文需要。
对于闭包,区别与“静态函数”(fn
)相反,注释是语法要求:如果不提供类型注释,您不能编写有效的静态函数,而一般来说,您可以编写不带类型注释的闭包。
但是编译器仍然需要知道闭包的具体类型,这需要能够推断参数和返回类型。如果因为没有足够的约束而不能,它会抱怨并需要明确指定的类型。
在您的示例中,没有任何限制 of 的类型num
,因此 rustc 无法知道具体的类型num
是什么,因此无法推断出闭包的具体类型应该是什么。
但在大多数情况下,例如
let it = repeat(5).map(|x| x+1);
编译器对此很满意,因为闭包的输入和输出类型必然是map
提供的,即Repeat::Item
,在这种情况下是i32
(因为这是整数文字默认禁止其他约束的内容)。
推荐阅读
- python - 如何用 numpy 命令替换列表理解?
- javascript - 我如何使用该值来计算?“10/10”
- uppaal - 如果 Uppaal 去掉相对时间怎么办?
- java - 使用 AES/CBC/NOPADDING 在 Node 中加密并使用相同算法在 JAVA 中解密会产生一些垃圾,例如 e�J�,�d�|*�5Ҝ��
- ruby-on-rails - 找不到带有 'id'=test 的产品
- android - 位图 getpixel 总是返回一个负数
- php - 如何为 Laravel 搜索过滤器功能创建查询语句?
- sql - Power bi 代码作为预计算迁移到 SQL
- javascript - 如何使用 Microsoft Graph 对 Vue.js 渐进式 Web 应用程序进行身份验证
- javascript - 如何从中间开始对数组进行排序?