在Rust中的类型提示中,可以在注释中使用部分类型,如下所示:
let myvec: Vec<_> = vec![1, 2, 3];
部分类型注释中下划线的正确术语是什么?我对Rust术语以及更多学术类型理论术语感兴趣。
答案 0 :(得分:8)
我能够找到一个piece of official documentation,其中下划线在模式的上下文中被命名,但我怀疑这是一个“严格”的名称:
模式由文字,结构化数组或枚举构造函数,结构和元组,变量绑定规范,通配符(..)和占位符(_)的某种组合组成。
The Book在词汇表中提供了以下说明:
_:“忽略”模式绑定(请参阅Patterns (Ignoring bindings))。也用于使整数文字可读(参见Reference (Integer literals))。
我无法找到将特定指向部分类型注释的定义,但我认为“占位符”(或“类型占位符”,取决于上下文)不会有歧义。
答案 1 :(得分:3)
经过一番挖掘后,似乎Vec<_>
一直被称为部分类型(因此在let x: Vec<_>
中我们有部分类型注释,而Fn(String) -> _
将是部分类型签名)但是在此上下文中_
不同地称为类型通配符或类型占位符,并且类型语法中的_
可以被读作“推断此类型”的标记(在提到PR时)下面,编译器内部TyInfer
。
一些有趣的读物:
_
to the Rust type grammar _
作为未指明的生命或类型的符号”PR的有趣细节:
let x: _ = 5;
let x = 5;
上面两行是等效的,并且都被解析为变量x
,其类型为TyInfer
。
答案 2 :(得分:2)
在编译器中,它似乎被称为 Infer
(在syntax::ast
,rustc::hir
和rustc::ty
中)
我认为这个命名有些合理,因为在进行类似Hindley-Milner的类型推断之前,这些_
被新的(类型)推理变量取代。
答案 3 :(得分:0)
似乎语法将其称为“推断类型”。根据{{3}}:
推断类型
语法:
InferredType : _
被推断的类型要求编译器根据周围可用的信息来推断类型。不能在项目签名中使用。它通常用于通用参数:
let x: Vec<_> = (0..10).collect();