为什么Rust有时会在generics中放置::之前的参数?

Tha*_*tos 8 grammar language-design rust

在Rust中声明vector类型的变量或哈希映射时,我们会:

let v: Vec<int>
let m: HashMap<int, int>
Run Code Online (Sandbox Code Playgroud)

要实例化,我们需要调用new().但是,我们这样做:

Vec::<int>::new()
   ^^
HashMap::<int, int>::new()
       ^^
Run Code Online (Sandbox Code Playgroud)

注意突然出现的::.来自C++,这些都很奇怪.为什么会这样?是否具有引导::使IDENTIFIER :: < IDENTFIER …容易解析比IDENTIFIER < IDENTIFIER,这可能会被解释为一个小于操作?(因此,这只是让语言更容易解析的一个问题吗?但是如果是这样的话,为什么不在类型规范中这样做,以便让两个镜像相互映射?)

(正如Shepmaster所说,经常Vec::new()就足够了;通常可以推断出这种类型.)

Sco*_*son 10

解析表达式时,无论a <是类型参数列表的开头还是小于运算符,都是不明确的.Rust总是假设后者并且需要::<类型参数列表.

解析类型时,它始终是一个明确的类型参数列表,因此::<永远不需要.

在C++中,这种歧义保留在解析器中,这使得解析C++比解析Rust要困难得多.请看这里解释为什么这很重要.

无论如何,大多数时候在Rust中,可以推断类型,你可以写Vec::new().因为::<通常不需要并且相当丑陋,所以仅保留<类型是有意义的,而不是使两个语法匹配.