为什么Rust不允许使用"let v = Vec<i32>::new();"这样的语法?

3

我认为Vec::<i32>::new()Vec<i32>不一致。

let v = Vec<i32>::new(); // cannot compile

let v1 : Vec<i32> = Vec::new(); // auto inference type parameters
let v2 = Vec::<i32>::new(); // quite weird

7
这里有问题吗?还是你来投诉的?虽然我同意 turbofish 看起来有点奇怪,但这就是 Rust 所拥有的。 - Kendas
请点击此处查看通过额外的::避免歧义的示例。 - user4815162342
@Kendas 我猜测问题出在解析上,但无法确认。我在这里想找出是否还有其他更深层次的原因。 - txhwind
由于Rust的类型推断,您通常甚至不需要指定向量元素的类型。例如,如果您将某些内容推送到未指定通用类型的向量中,Rust会向后工作并推断它必须是推送元素的类型。谢谢。 - BallpointBen
1个回答

7

这种符号被亲切地称为“涡轮鱼”。

Vec<i32>::new()在解析时存在一个折衷。这个<是引入泛型参数,还是小于运算符?要区分需要潜在的无限先行查找,而“涡轮鱼”可以避免这种情况。

并非所有人都认为这很重要。曾经有提议允许Vec<i32>::new(),但该提议已被放弃。请参见此处

尽管如此,由于类型推断,相较于其他类似语言中不常需要指定类型参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接