在Rust中声明vector或hash map类型的变量时,我们会:

let v: Vec<int>
let m: HashMap<int, int>

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

Vec::<int>::new()
   ^^
HashMap::<int, int>::new()
       ^^

注意突然出现的::.来自C++,这些都是奇怪的.为什么会发生这种情况?前导::是否使IDENTIFIER :: < IDENTFIER …IDENTIFIER < IDENTIFIER更容易解析,IDENTIFIER < IDENTIFIER可能被理解为小于运算?(因此,这只是为了让语言更容易解析?如果是的话,为什么不在类型规范中也这样做,以便两种语言相互镜像呢?)

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

推荐答案

解析表达式时,<是类型参数列表的开头还是小于运算符是不明确的.Rust总是采用后者,类型参数列表需要::<.

当解析一个类型时,它总是一个明确的类型参数列表,所以不需要::<.

在C++中,这种歧义被保留在解析器中,这使得解析C++比解析Rust 困难得多.有关这一点的解释,请参见here.

不管怎样,在Rust中有most次,类型可以推断,你只需要写Vec::new()个.由于::<通常不需要,而且相当难看,所以在类型中只保留<是有意义的,而不是让两个语法匹配.

Rust相关问答推荐

程序退出后只写入指定管道的数据

如何找到一个数字在二维数组中的位置(S)?

如何在Rust中将选项<;选项<;字符串>;转换为选项<;选项&;str>;?

为什么`AlternateScreen`在读取输入键时需要按Enter键?

Rust从关联函数启动线程

如何设置activx websocket actorless的消息大小限制?

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

为什么 `Deref` 没有在 `Cell` 上实现?

提取指向特征函数的原始指针

从字节数组转换为字节元组和字节数组时,为什么 Transmute 会对字节重新排序?

为什么Rust中无法推断生命周期?

从Rust 的临时文件中创建引用是什么意思?

decltype、dyn、impl traits,重构时如何声明函数的返回类型

有没有办法隐式绑定 let/match 操作的成员?

std::vector::shrink_to_fit 如何在 Rust 中工作?

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

哪些特征通过 `Deref` 而哪些不通过?

返回引用字符串的future

在 FFI 的上下文中,未初始化是什么意思?

在 Rust 中为泛型 struct 编写一次特征绑定