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

标签 types rust

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

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

最佳答案

[i] Rust 中的语法来自于实现 std::ops::Index trait .

那个特征看起来像这样:

pub trait Index<Idx> 
where
    Idx: ?Sized, 
{
    type Output: ?Sized;
    fn index(&self, index: Idx) -> &Self::Output;
}

你可以实现Index对于一个类型多次,每次用不同的类型为 Idx范围。 Vec通过使用 Index 的整体实现来支持尽可能多的不同索引机制:

impl<T, I> Index<I> for Vec<T>
where
    I: SliceIndex<[T]>, 

这适用于任何也有 SliceIndex 的类型实现,其中包括 usize ,正如您尝试使用的那样,还有范围类型,例如 Range<usize> (例如 0..5 )和 RangeFrom<usize> (例如 0.. )。在闭包内部,编译器不知道 Index哪个实现将被使用,并且每种可能性都可能有不同的 Output类型,这就是为什么它不能在那里推断出单一类型的原因。

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

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);

关于types - 为什么索引显式类型的向量会因类型推断错误而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56611350/

相关文章:

rust - 如何基于快速错误扩展错误?

rust - 在 Rust 中为特定类型实现结构体的函数

C# 泛型和类型检查混淆

android - Android Studio 中不支持的类型 'add-resource'

go - 无法在给定类型的类型定义上调用方法

perl - Perl 中 `$this` 、 `@that` 和 `%those` 之间有什么区别?

redux - react native中的mapStateToProps、mapDispatchToProps类型和选择器有什么区别

rust - 我是否必须为拥有(易于使用)和借用(更高效)的数据结构创建不同的结构?

rust - 没有显示过分的文字,我也不知道为什么

vector - Rust 是否包含一种直接检查一个向量是否是另一个向量的 "substring"的方法?