为什么 NamedTuples 和(不可变的)结构是分开的?
Why are NamedTuples and (immutable) structs separate?
有人可以解释为什么 NamedTuple
s 和不可变的 struct
s 是分开的,而不是 NamedTuple
s 是匿名的 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 时,将字段名称列表作为列表传递。命名元组为预期字段创建规范合同并减少代码破坏的机会。
有人可以解释为什么 NamedTuple
s 和不可变的 struct
s 是分开的,而不是 NamedTuple
s 是匿名的 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 时,将字段名称列表作为列表传递。命名元组为预期字段创建规范合同并减少代码破坏的机会。