在下面的 代码 中,我创建了一个向量,然后将其用作闭包的内容:
为什么虽然向量明确指定了类型,但代码仍无法通过类型推断而编译失败?
fn main() {
let f = {
let xs: Vec<(usize, usize)> = Vec::new();
// populate xs
move |i, j| xs[j].1 - xs[i].0
};
let x = f(1usize, 2usize);
}
为什么虽然向量明确指定了类型,但代码仍无法通过类型推断而编译失败?
error[E0282]: type annotations needed
--> src/main.rs:5:21
|
5 | move |i, j| xs[j].1 - xs[i].0
| ^^^^^ cannot infer type
|
= note: type must be known at this point
1usize
,2usize
,以便它知道要使用哪个实现。但它仍然不起作用。我必须显式地输入参数。为什么会这样? - Listeronef
是泛型的,所以需要适用于任何可能的索引类型。在f
内部声明实际类型为usize
会有效地使其不再是泛型。在f
外部声明类型只是选择该调用的类型 - 但是f
仍然需要适用于所有其他类型。 - Peter Hall