Rust 元组使用点表示法的原因

Rust 元组使用点表示法的原因,rust,Rust,Rust被设计为对元组使用点符号而不是索引符号(t[2])有什么技术原因吗 点表示法在访问结构和对象的属性时似乎很自然。我无法在网上找到资源或解释。此决定是在年做出的。动机部分包含详细信息: 现在,访问元组和元组结构的字段是一件非常痛苦的事情,必须仅依靠模式匹配来提取值。这就成了一个问题,在标准库(core::tuple::tuple*)中创建了12个trait,以简化对tuple值的访问,添加了.valN()、.refN()和.mutN()方法来帮助实现这一点。但这不是一个很好的解决方案,它需

Rust被设计为对元组使用点符号而不是索引符号(
t[2]
)有什么技术原因吗

点表示法在访问结构和对象的属性时似乎很自然。我无法在网上找到资源或解释。

此决定是在年做出的。动机部分包含详细信息:

现在,访问元组和元组结构的字段是一件非常痛苦的事情,必须仅依靠模式匹配来提取值。这就成了一个问题,在标准库
(core::tuple::tuple*)
中创建了12个trait,以简化对tuple值的访问,添加了
.valN()
.refN()
.mutN()
方法来帮助实现这一点。但这不是一个很好的解决方案,它需要在标准库中实现特征,而不是在语言中实现,并且在使用时导入这些特征。总的来说,这不是一个问题,因为大部分时间
std::prelude::*
都是导入的,但这仍然是一种黑客行为,并不能真正解决当前的问题。它还只支持长度不超过12的元组,这通常不是问题,但强调了当前情况有多糟糕


中的讨论也很有用。

我没有参与设计决策,但以下是我的观点:

元组包含混合类型。也就是说,不能保证(t[i])==type_of(t[j])的属性
type_

然而,传统的索引工作的前提是
t[i]
中的
i
不需要是编译时常数,这反过来意味着
t[i]
的类型需要对所有可能的
i
统一。在实现索引的所有其他rust集合中都是如此。具体而言,通过实现以下特征,使锈蚀类型可转位:

pub trait Index<Idx> where Idx: ?Sized {
    type Output: ?Sized;
    fn index(&'a self, index: Idx) -> &'a Self::Output;
}
pub特征索引,其中Idx:?大小{
类型输出:?尺寸;
fn索引(&'a self,索引:Idx)->&'a self::输出;
}
所以,如果您想要一个元组来实现索引,那么
Self::Output
应该是什么类型?实现这一点的唯一方法是使
Self::Output
成为一个枚举,这意味着元素访问必须围绕程序员端的一个无用的
match t[i]
子句(或类似的东西)进行,您将在运行时而不是在编译时捕获类型错误

此外,您现在必须实现边界检查,这也是一个运行时错误,除非您在元组实现方面很聪明


您可以通过要求索引按编译时常量进行来绕过这些问题,但此时元组项访问假装像正常的索引操作,而实际上与所有其他容器的行为不一致,这没有什么好处。

使用
t.2
语法而不是
t[2]
的原因最好解释如下:

其他地方的索引语法具有一致的类型,但元组是异构的,因此
a[0]
a[1]
将具有不同的类型


我想从我发布这个问题以来使用函数式语言(Ocaml)的经验中提供一个答案

除了@rom1v reference之外,像
a[0]
这样的索引语法也被用于某种序列结构中,而元组不是。例如,在Ocaml中,元组
(1,“one”)
被称为具有类型
int*string
,该类型符合(即,平面为R^2=R*R)。另外,通过
nth
索引访问元组被认为是不规则的


由于其多态性,元组几乎可以被认为是一个记录/对象,它通常更喜欢使用点表示法(如
a.fieldName
)作为访问其字段的约定(Javascript语言除外,Javascript语言将对象视为字典,并允许字符串文本访问,如
a[“fieldName”]
。我所知道的唯一使用索引语法访问字段的语言是Lua


就个人而言,我认为像
a.(0)
这样的语法看起来比
a.0
更好,但这可能是有意的(或无意的)考虑到在大多数函数式语言中,模式匹配元组是理想的,而不是通过其索引访问元组。由于Rust也是必需的,像
a.10
这样的语法可以很好地提醒模式匹配或“使用结构”已经有了。

为什么不呢?由于元组的大小是固定的,并且可以有不同类型的元素,因此它更类似于结构属性而不是数组索引。您使用“我们”一词是否意味着您参与了决策?以及“不同语法”是否指的是
t.2
语法(这似乎并不完全清楚).我之所以说“我们”,是因为我是核心团队的成员,但据我记忆所及,这个决定是在我参与之前做出的,至少在2012年之前。(是的,这就是我所指的区别)你的答案将得到改进,包括一个简短的理由摘要,而不仅仅是链接到另一个网站上的信息。你可能还想在答案中提到你是核心团队的成员。我认为核心团队的成员资格对于这个答案来说是没有意义的。史蒂夫当时不是团队的成员时间,即使他是,也没关系,除非他亲自帮助这个RFC。然而,总结信息将符合SO的规则,反对只链接的答案。感谢大家和@Keith Thompson的链接!虽然它最初来自像Python这样的duck类型语言,你不需要太在意abo但是每个迭代器的不同之处在于,它实际上对“小心”的生锈方式是有意义的。“我所知道的唯一一种使用索引语法访问字段的语言是Lua。”Python也索引元组。但是Python是动态类型的,所以
pub trait Index<Idx> where Idx: ?Sized {
    type Output: ?Sized;
    fn index(&'a self, index: Idx) -> &'a Self::Output;
}