Rust 的设计者有没有公开说过为什么索引数组的语法与索引元组的语法不同?

Bro*_*her -2 arrays indexing tuples language-lawyer rust

在 Rust 中,元组可以使用点(例如:)进行索引x.0,而数组可以使用方括号(例如:)进行索引x[0]。乍一看,这在我看来似乎会使重构现有代码变得更加困难,而没有任何实际目的。但是,我可能只是错过了一些东西。Rust 的创建者是否曾对此发表评论并告诉我们他们为什么选择以这种方式构建语言?

Luk*_*odt 5

这个元组字段访问语法是在RFC 184讨论线程)中引入的。在此之前,您必须解构所有元组(和元组结构)以访问它们的值,或使用标准库中的特殊特征。

RFC 本身没有详细介绍替代[index]语法,但讨论线程做了。我看到我们最终使用.index语法的三个主要原因:

[]std::ops::Index

[index]语法是密切相关的ops::Index特点。它允许您为自己的类型重载该运算符。根据设计特征的方式,该index方法(在您使用 时调用[])必须每次都返回相同的类型。所以ops::Index不能用于异构类型。并且由于[]与 trait 非常相关,所以有一些[]不使用的特殊用法可能会很奇怪std::ops::Index

正如reddit上所指出的那样,索引本身(即tuple[0]tuple[1]等)作为替代方案是没有意义的,因为元组是异构的。(它们绝对不能用来实现这些Index*特性。)

评论

索引语法 [is] 实际上非常不合适。值得注意的是,索引语法其他地方具有一致类型,但元组是异质所以a[0]a[1]会有不同的类型。

评论

元组/元组结构作为具有匿名字段的结构

Rust 有其他异构数据类型:structs。您可以使用.field语法访问它们的字段。将元组结构描述为具有未命名字段的结构,并将元组描述为未命名的元组结构,将两者都视为结构是有意义的。然后,.0感觉就像引用一个未命名的字段。

我觉得,尤其是在静态类型语言中,a[1], a[2], ..., a[N] 的类型应该是一样的。

是的,这就是为什么没有人提倡向元组添加索引语法的原因。tuple.1 语法更适合;它基本上是匿名字段访问,而不是索引。

评论

元组和元组结构只是具有按定义排序的匿名字段的结构,因此两者都应该支持将字段作为左值直接访问的语法,以使使用它们更加一致和更容易。

评论

受斯威夫特的影响

Swift 已经有了这种语法,并且似乎受到了影响:

作为参考,Swift 允许使用这种元组索引语法,并允许使用它进行赋值。

评论

+1 swift 有很多实用的调整,IMO 就是其中之一。

评论

感谢 swift 将会有一个熟悉 .0 .1 ... 符号的大型社区

评论


顺便说一句:从这个帖子可以看出,“Rust 的设计师”在大多数情况下实际上只是社区成员。当然,当时 RFC 流程有其问题(而且仍然不完美),但是您可以在线阅读大部分讨论,社区成员对提议的语法发表评论。