为什么 NamedTuples 和(不可变的)结构是分开的?

Why are NamedTuples and (immutable) structs separate?

有人可以解释为什么 NamedTuples 和不可变的 structs 是分开的,而不是 NamedTuples 是匿名的 struct 就像有匿名函数 function (x) x^2 end?它们看起来在概念上具有相同的结构(我也想知道它们是否具有不同的内存布局),尽管它们有不同的方法来访问它们的字段(下面的示例)。为 struct 实施 NamedTuple 方法似乎非常合理,但我可能只是不知道不这样做的充分理由。

struct X; a; b; c; end

Xnt = NamedTuple{(:a,:b,:c), Tuple{Any, Any, Any}}

t1 = (10, 20.2, 30im)
#
#
# t1[1]          indexing by position
# t1[1:2]        slicing
# for el in t1   iteration

x1 = X(t1...)
# x1.a           getting field

xnt1 = Xnt(t1)
# xnt1.a         getting field
# xnt1[:a]       indexing by field
# xnt1[1]        indexing by position
#
# for el in t1   iteration

每个具有相同名称和字段类型的 NamedTuple 实例都是相同的类型。不同的结构体(类型)可以有相同数量和类型的字段但是是不同的类型。

命名元组具有元组中每一列的名称。命名元组是数据框的替代品。实例化 namedTuple 时,将字段名称列表作为列表传递。命名元组为预期字段创建规范合同并减少代码破坏的机会。