rust - 为什么 Rust 不推断这个闭包的返回类型?
问题描述
Rust 编译器通常能够推断从闭包返回的表达式的类型:
fn main() {
let a_closure = |num|{
num+1.0
};
println!("{}", a_closure(1.0));
}
但是当我使用return
语句定义相同的闭包时,编译器无法推断类型:
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
在闭包中使用语句而不阻止编译器推断其返回类型?
解决方案
这是由于缺少分号。如果没有分号,则返回最后一个表达式,最后一个表达式是return num + 1.0
. 由于 return 语句使程序跳转到某个地方,否则它的值可以是任何值,例如:
fn main() {
let a: String = return;
}
但是,如果编译器没有看到直接分配给它的类型,它将选择该类型()
作为 return 语句的值。
所以发生的事情是:
- 编译器看到闭包中的最后一个表达式,并
()
默认为其分配类型。 - 然后编译器会在闭包内看到一个显式的 return,它返回 type
i32
。
因此,由于有两次尝试从闭包返回,并且它们各自返回不同的类型,所以这是类型不匹配。
推荐阅读
- kik - 强制取消订阅 Kik 机器人
- php - 仅添加到外部链接 nofollow noopener 和 _blank 标签
- arrays - 访问数组元素,其中(数组)是汇编中的结构元素(MASM)
- laravel-5.6 - Laravel Passport:将 Auth Guard 添加到 Passport 路由?
- ldap - 用于 LDAP 过滤器查询的 AST
- angular - 如何在 Angular4 中使用 Chart.js?
- python - Pytorch:“模型权重不变”
- node.js - 我如何过滤来自 express 服务器和 nodejs 的 GET 查询
- swift - 如何使用 Data 和 Codable 在 Swift 中优化 NSAttributedString 的存储?
- docker - 不能在两个容器之间卷曲