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