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>代码进行矢量化,所以如果您想提交它,我认为它是“答案”。