【发布时间】:2015-03-10 03:15:17
【问题描述】:
在 Rust 中声明向量类型的变量或哈希映射时,我们会这样做:
let v: Vec<int>
let m: HashMap<int, int>
要实例化,我们需要调用new()。但是,我们这样做:
Vec::<int>::new()
^^
HashMap::<int, int>::new()
^^
注意:: 的突然出现。来自 C++,这些很奇怪。为什么会出现这些?具有领先的:: 是否使IDENTIFIER :: < IDENTFIER … 比IDENTIFIER < IDENTIFIER 更容易解析,这可能被解释为小于运算? (因此,这只是为了让语言更容易解析?但如果是这样,为什么不在类型规范中也这样做,以使两者相互镜像?)
(正如 Shepmaster 所说,Vec::new() 通常就足够了;通常可以推断出类型。)
【问题讨论】:
-
它们在 Rust 中不被称为 模板;我认为你的 C++ 正在展示。 :-) 有趣的是,我从未见过指定类型参数的特殊用法。使用类型推断,你可以说
Vec::new()。我唯一一次看到指定这样的类型是针对返回特征的函数,您必须选择具体类型,例如parse或collect。 -
@Shepmaster:Ack,它们是泛型的,不是吗?是的,一定数量的类型推断可以避免您需要指定实际类型;我想我偶然发现了这一点,主要是作为 Rust 的新手,还没有意识到类型推断可以做到这一点,并且仍然想知道为什么。
-
我认为这是个好问题;我什至没有意识到您可以在该位置指定类型参数!我期待一个答案,但我的猜测是,正如您所建议的那样,这将归结为解析的简单性。我只是想发表评论以表明您的示例代码并不常见,希望对阅读此问题的其他新手有所帮助。干杯!
-
在大多数情况下,类型推断确实可以解决问题,但有些函数的类型参数既不出现在参数中,也不出现在返回值中,在这种情况下,您必须使用该语法。这种函数的一个例子是std::mem::size_of()
标签: rust grammar language-design