考虑以下工作的代码:
以下变量无法编译:
它失败了,如下所示:
要修复它,必须注释
fn f() {
let xs = vec![(0, 0)];
let f = |j| xs[j];
let y = f(0usize);
}
以下变量无法编译:
fn f() {
let xs = vec![(0, 0)];
let f = |j| xs[j].0;
let y = f(0usize);
}
它失败了,如下所示:
error[E0282]: type annotations needed
--> src/lib.rs:3:17
|
3 | let f = |j| xs[j].0;
| ^^^^^ cannot infer type
|
= note: type must be known at this point
要修复它,必须注释
j
:fn f() {
let xs = vec![(0, 0)];
let f = |j: usize| xs[j].0;
let y = f(0usize);
}
Rust book中提到:
与fn函数不同,闭包不要求您注释参数或返回值的类型。
为什么必须显式声明j
的类型?
y
从未被使用,因此我认为它不会尝试完全检查 rhs 表达式。在 OP 的情况下,xs[j].0
被用作闭包的返回值。我认为编译器不能轻易地跨函数(或闭包)边界进行优化,这就是为什么它没有看到该返回值从未被使用并且可以被忽略的原因。 - Jmbindex(_)
的输出类型中找到index(_)
输入的类型。这是正常的,因为根据SliceIndex
的实现,输出 可以是任何东西,但它似乎也没有从f(0usize)
这一行推断出输入类型,也许问题应该是为什么不从f(0usize)
推断? - Ömer Erdenf(0usize).0
能够工作,因为输入类型已知。但是我不知道类型检查算法是如何工作的。 - Ömer Erden