【发布时间】:2021-01-14 21:13:27
【问题描述】:
Rust 编译器通常能够推断从闭包返回的表达式的类型:
fn main() {
let a_closure = |num|{
num+1.0
};
println!("{}", a_closure(1.0));
}
但是当我定义相同的闭包using a return statement时编译器无法推断类型:
fn main() {
let a_closure = |num|{
return num+1.0
};
println!("{}", a_closure(1.0));
}
/*
error[E0308]: mismatched types
--> src/main.rs:3:9
|
3 | return num+1.0
| ^^^^^^^^^^^^^^ expected `()`, found `f64`
*/
我很惊讶 Rust 不能在这里推断类型:是否可以在闭包中使用 return 语句而不阻止编译器推断其返回类型?
【问题讨论】:
-
有趣的是,添加类型注释
num: f64修复了使用return时的编译。缺乏推理可以作为编译器的错误或功能请求提交。但是,令人困惑的错误消息可能被视为错误。消息“预期为(),发现f64”似乎不适合该示例,注释num: f64看起来不应该影响它。 -
该消息适用于该错误,它表示 rustc 推断返回类型为
(),但我们返回的是f64。请注意fn foo() { 1.0f64 }如何触发完全相同的错误消息(除了 它 建议添加返回类型)。 -
调用
a_closure(1.0f64)也可以解决问题。 -
向闭包添加显式返回类型也可以修复错误:
|num| -> f64 { return num+1.0 } -
@Masklinn 如果编译器的推论受到要求
()作为返回类型的约束的支持,则错误消息将是适当的,但这里的情况并非如此。这就是为什么我认为该消息令人困惑,或者至少具有误导性:它似乎暗示了这种不存在的约束。此外,foo和return foo;之间的区别(最后的分号没有区别)似乎是一个直接的错误。
标签: rust type-inference