Types Julia中是否有将类型的字段值转储到元组中的函数?

Types Julia中是否有将类型的字段值转储到元组中的函数?,types,julia,Types,Julia,像这样的工作 struct MyStruct x y z end x = MyStruct(1, 2, 3) a, b, c = ntuple(i -> getfield(x, fieldnames(MyStruct)[i]), length(fieldnames(MyStruct))) 但我忍不住认为我只是在重新发明轮子。您可以对如下字段名称应用getfield: getfield.(Ref(x), fieldnames(typeof(x))) 您还可以将

像这样的工作

struct MyStruct
    x
    y
    z
end

x = MyStruct(1, 2, 3)

a, b, c = ntuple(i -> getfield(x, fieldnames(MyStruct)[i]), length(fieldnames(MyStruct)))

但我忍不住认为我只是在重新发明轮子。

您可以对如下字段名称应用
getfield

getfield.(Ref(x), fieldnames(typeof(x)))
您还可以将
Ref(x)
替换为
(x,)
[x]
,以防止
x
被广播。下面是一个示例,说明了如何悄悄地得到错误的结果:

julia> using NamedArrays

julia> x = NamedArray(fill((array=1, dicts=2, dimnames=3),3))
3-element Named Array{NamedTuple{(:array, :dicts, :dimnames),Tuple{Int64,Int64,Int64}},1}
A  │
───┼─────────────────────────────────────
1  │ (array = 1, dicts = 2, dimnames = 3)
2  │ (array = 1, dicts = 2, dimnames = 3)
3  │ (array = 1, dicts = 2, dimnames = 3)

julia> getfield.(Ref(x), fieldnames(typeof(x))) # correct
(NamedTuple{(:array, :dicts, :dimnames),Tuple{Int64,Int64,Int64}}[(array = 1, dicts = 2, dimnames = 3), (array = 1, dicts = 2, dimnames = 3), (array = 1, dicts = 2, dimnames = 3)], (OrderedCollections.OrderedDict("1"=>1,"2"=>2,"3"=>3),), (:A,))

julia> getfield.(x, fieldnames(typeof(x))) # wrong
3-element Named Array{Int64,1}
A  │
───┼──
1  │ 1
2  │ 2
3  │ 3

我不知道有哪一个函数或宏可以做到这一点,但是
map(I->getfield(x,I),fieldnames(typeof(x))
至少更紧凑一些。或者
getfield.(Ref(x),fieldnames(typeof(x))
@BogumiłKamiński噢,所以
getfield
是矢量化的。我以为不是。为什么这里需要
Ref()
Ref
之所以需要,是因为您希望保护
x
不被广播(它可能是定义
轴的集合
)。您也可以编写
(x,)
[x]
来执行“保护”任务。@BogumiłKamiński收到了,谢谢。由于您的建议允许以简单的方式对<代码> GETFiels>代码进行矢量化,所以如果您想提交它,我认为它是“答案”。