为什么Rust有时会在泛型中把a::放在参数之前?

为什么Rust有时会在泛型中把a::放在参数之前?,rust,grammar,language-design,Rust,Grammar,Language Design,在Rust中声明vector类型的变量或哈希映射时,我们执行以下操作: let v: Vec<int> let m: HashMap<int, int> 注意突然出现的:。来自C++,这些都是奇怪的。为什么会发生这种情况?具有前导的:是否使标识符::

在Rust中声明vector类型的变量或哈希映射时,我们执行以下操作:

let v: Vec<int>
let m: HashMap<int, int>
注意突然出现的
。来自C++,这些都是奇怪的。为什么会发生这种情况?具有前导的
是否使
标识符::
标识符
更容易解析,后者可能被解释为小于操作?(因此,这只是为了使语言更容易解析?如果是这样,为什么不在类型规范期间也这样做,以便使两种语言相互镜像?)


(正如Shepmaster所指出的,通常
Vec::new()
就足够了;类型通常可以推断出来。)

解析表达式时,两个不同的语法是否不一定指定相同的类型参数将是不明确的

在本例中:

let mut map: HashMap<K, V>;
K
V
填充定义方法
new
的impl块的类型参数!impl块不需要与类型本身具有相同、相同或相同的默认类型参数


在这种特殊情况下,结构具有参数
HashMap
(3个参数,1个默认值)。包含
::new()
的impl块具有参数
impl
(2个参数,未针对任意状态实现)。

它们在Rust中不称为模板;我认为你的C++正在显示。有趣的是,我从未见过指定类型参数的特殊用法。使用类型推断,您只需说
Vec::new()
。我见过的唯一一次这样指定类型是为返回特征的函数指定的,你必须选择一个具体的类型,比如
parse
collect
@Shepmaster:Ack,它们是泛型,不是吗?是的,一些类型推断可以避免您需要指定实际的类型;我想我主要是作为Rust的新手偶然发现了这一点,但我还没有意识到类型推理可以做到这一点,我仍然想知道为什么;我甚至没有意识到您可以在那个位置指定类型参数!我期待一个答案,但我的猜测是,正如您所建议的,它将归结为解析的简单性。我只是想评论一下,说明您的示例代码并不常见,希望能帮助其他阅读此问题的新手。干杯在大多数情况下,类型推断确实可以做到这一点,但有些函数的类型参数既不出现在参数中,也不出现在返回值中,在这种情况下,您必须使用该语法。这类函数的一个例子是,您知道在变量声明期间是否有任何理由不复制语法,比如
let v:Vec::
?我在结束时对此进行了编辑。我认为,基本上,
::这是作为一个单一符号进行的词法分析/解析
::不,你可以写
::我哀叹,如果rust遵循scala并为泛型保留
[]
,而不是将它们浪费在数组索引上,那么
apply
操作符的
()
也能很好地服务于此。
let mut map: HashMap<K, V>;
HashMap::<K, V>::new()