请考虑以下工作code:
fn f() {
let xs = vec![(0, 0)];
let f = |j| xs[j];
let y = f(0usize);
}
以下variation无法编译:
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);
}
不要求您注释参数的类型或 返回值就像fn函数一样。
为什么必须显式键入j
?
答案 0 :(得分:0)
如@Stargateur建议的duplicate中所述,Rust需要知道索引的类型,以便可以确定结果的类型。在第一个示例中,这不是问题,因为您没有使用xs[j]
或闭包的结果,因此编译器可以随意将它们保留为“某种尚未定义的类型”,并且可以对其进行优化,需要知道类型。
但是,在第二个示例中,您尝试访问xs[j].0
,为此编译器需要知道xs[j]
的类型才能知道如何处理.0
。 / p>