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语句而不阻止编译器推断它的返回类型?
发布于 2021-01-15 18:21:28
这是由于缺少分号造成的。如果没有分号,则返回最后一个表达式,最后一个表达式为return num + 1.0。因为return语句会使程序跳到某个地方,否则,它的值可以是任何东西,例如:
fn main() {
let a: String = return;
}但是,如果编译器没有看到分配给它的直接类型,它将选择类型()作为返回语句的值。
所以发生的事情是:
()。()因此,由于有两次尝试从闭包返回,并且每次都返回不同的类型,所以这是一个类型不匹配。
https://stackoverflow.com/questions/65726999
复制相似问题