Types 为什么显式类型化向量的索引会因类型推断错误而失败?

Types 为什么显式类型化向量的索引会因类型推断错误而失败?,types,rust,Types,Rust,在下面的示例中,我生成一个向量,然后将其用作闭包的内容: fn main(){ 设f={ 设xs:Vec=Vec::new(); //填充xs 移动| i,j | xs[j].1-xs[i].0 }; 设x=f(1size,2usize); } 为什么尽管向量是显式类型化的,但代码编译失败并出现类型推断错误 错误[E0282]:需要类型注释 -->src/main.rs:5:21 | 5 | move | i,j | xs[j].1-xs[i].0 |^^^^无法推断类型 | =注意:此时必须

在下面的示例中,我生成一个向量,然后将其用作闭包的内容:

fn main(){
设f={
设xs:Vec=Vec::new();
//填充xs
移动| i,j | xs[j].1-xs[i].0
};
设x=f(1size,2usize);
}
为什么尽管向量是显式类型化的,但代码编译失败并出现类型推断错误

错误[E0282]:需要类型注释
-->src/main.rs:5:21
|
5 | move | i,j | xs[j].1-xs[i].0
|^^^^无法推断类型
|
=注意:此时必须知道类型

Rust中的
[i]
语法来自于实现

这种特征看起来是这样的:

pub trait Index<Idx> 
where
    Idx: ?Sized, 
{
    type Output: ?Sized;
    fn index(&self, index: Idx) -> &Self::Output;
}
这将适用于同样具有
切片索引
实现的任何类型,包括您尝试使用的
usize
,但也适用于范围类型,如
range
(例如
0..5
)和
range from
(例如
0..
)。在闭包内部,编译器不知道将使用
索引的哪个实现,并且每个可能性都可能有不同的
输出类型,这就是为什么它不能推断出单一类型的原因

您可以通过注释闭包的参数来修复它:

let f = {
    let xs: Vec<(usize, usize)> = Vec::new();
    //
    move |i: usize, j: usize| xs[j].1 - xs[i].0
};
let x = f(1, 2);
设f={
设xs:Vec=Vec::new();
//
move | i:usize,j:usize | xs[j].1-xs[i].0
};
设x=f(1,2);

谢谢,但我明确地将1和2键入为
1size
2usize
,因此它确切地知道要使用哪个实现。它仍然不起作用。我必须显式地键入参数。“这是为什么?”李斯特龙说。因为
f
是泛型的,因此需要适用于任何可能的索引类型。在
f
内部将实际类型声明为
usize
可以有效地阻止它成为泛型。在
f
之外声明类型只需为该调用选择类型,但是
f
仍然需要为所有其他类型工作。
let f = {
    let xs: Vec<(usize, usize)> = Vec::new();
    //
    move |i: usize, j: usize| xs[j].1 - xs[i].0
};
let x = f(1, 2);