为什么对显式类型化向量进行索引会失败并出现类型推断错误?

2023-12-01

In the 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

The [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> (e.g. 0..5) and RangeFrom<usize> (e.g. 0..)。在闭包内部,编译器不知道which实施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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么对显式类型化向量进行索引会失败并出现类型推断错误? 的相关文章

  • 具有查找功能的优先级队列 - 最快的实现

    我正在考虑实现一个带有附加要求的优先级队列 一个查找 搜索功能 它将告诉一个项目是否在队列中的任何位置 所以函数将是 insert del min 和 find 我不确定是否应该使用堆或自平衡二叉搜索树 看来 PQ 通常是用堆实现的 但我想
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 了解特征和对象安全

    我正在努力学习对象安全的基础知识 如果我有这个代码 struct S x i32 trait Trait Sized fn f self gt i32 where Self Sized fn object safety dynamic x
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ
  • Python:检查对象是否是字符串列表

    如何检查一个对象是否是字符串列表 我只能检查对象是否是字符串 def checktype obj if isinstance obj str print It s a string obj1 foo bar bar black sheet
  • Rust 中类似结构的重复代码删除

    我有一个小项目 其中有一些类似的结构 其中的实现Ord and PartialOrd是一样的 我是 主要 动态语言的新手 其中代码重复通常被认为是反模式 我想知道是否有办法避免重复此代码 或者 更一般地说 这是我应该担心 Rust 的问题吗
  • 为什么在闭包参数中使用“&&”?

    我有两个问题这个例子 https doc rust lang org std iter trait Iterator html method find let a 1 2 3 assert eq a iter find x x 2 Some
  • 如何让 Visual Studio Code 重置 Rust 的 IntelliSense 引擎?

    我正在开发两个项目 一个是一个库 另一个是使用该库的程序 当我对库进行更改时 其他窗口 程序 看不到这些更改 因此我没有获得更新的 IntelliSense 关闭使用该库的程序并重新打开它确实会强制更新 但我真的不想走那么远 直接回答标题
  • 使用新的定义文件添加到现有库打字稿类型

    我正在使用这个库https github com chentsulin koa bearer token https github com chentsulin koa bearer token它向 koa 库请求对象添加了一个额外的属性
  • 为什么类型级计算需要 Aux 技术?

    我很确定我在这里遗漏了一些东西 因为我对 Shapeless 还很陌生并且我正在学习 但是 Aux 技术实际上是什么时候required 我看到它是用来暴露type通过将其提升为另一个 同伴 的签名来声明type定义 trait F A t
  • 从 WebAssembly .wasm 模块获取 JavaScript 导入对象条目

    我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容 以便我可以提供有效的importObject到实例化函数 WebAssembly instantiate bufferSource importObject 据我了解 执行此
  • 有条件地从 flat_map 返回空迭代器

    鉴于这个定义foo let foo vec vec 1 2 3 vec 4 5 6 vec 7 8 9 我希望能够编写这样的代码 let result Vec lt gt foo iter enumerate flat map i row
  • 是否可以在 .NET 中编写仅接受数字类型的通用函数?

    假设我想编写一个如下所示的函数 像往常一样 一个简单的示例用于说明目的 Public Function calcSqSum Of T ByVal list As IEnumerable Of T As T Dim sumSq As T Fo
  • 仅当处于发布模式时,我如何在没有窗口的情况下运行 Rust 程序[重复]

    这个问题在这里已经有答案了 我目前正在开发一个 Rust 项目 并且经常需要调试和部署它 虽然它已部署 但它在后台运行 没有窗口 但当我调试时 我想要一个窗口来查看是否存在任何运行时错误 我目前使用 windows subsystem wi
  • Box、ref、&、*的理解及关系

    我对 Rust 中的指针如何工作有点困惑 有ref Box 而且我不确定他们如何一起工作 目前我的理解是这样的 Box并不是真正的指针 它是一种在堆上分配数据并在函数参数中传递未调整大小的类型 尤其是特征 的方法 ref在模式匹配中用于借用
  • 如何异步读取文件?

    我可以创建一个单独的线程来充当 I O 队列 但我不确定这是否是最好的方法 看起来是最好的 我不知道如何加载本地文件mio https github com carllerche mio 使用 tokio fs read use tokio
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • 如何解决函数签名中的“UndefVarError:T未定义”

    我正在尝试运行 其他人的代码 看起来像 function f T lt Number n Int alpha T beta T end 当 使用 该文件时我得到 UndefVarError T not defined Stacktrace
  • 我可以有效地从 HashSet 中随机采样吗?

    我有一个std collections HashSet 我想采样并删除一个均匀随机的元素 目前 我正在做的是使用随机抽样索引rand gen range 然后迭代HashSet到该索引来获取元素 然后我删除选定的元素 这可行 但效率不高 有

随机推荐