如果我有一个大型结构体,我想创建一个数组(例如稍后创建一个StructArray
),那么当我有关键字默认值时,如何创建一个结构体数组。
例如
Base.@kwdef struct MyType
a = 0
b = 0
c = 0
d = 0
... # can be up to 10 or 20 fields
end
Run Code Online (Sandbox Code Playgroud)
Base.@kwdef
很好,因为我可以使用创建对象MyType(b=10,e=5)
,但有时我有参数数组。我希望能够广播或简洁地构造一个结构数组。
也就是说,我希望以下内容创建一个由三个组成的数组MyType
:MyType.(c=[5,6,7],d = [1,2,3])
相反,它创建单个MyType
wherec
和d
are 数组而不是标量值。
Base.@kwdef
有哪些方法可以保持结构体构造的便利性和简单性?
似乎是一个很好的理解用例:
julia> [MyType(c=cval, d=dval) for (cval, dval) in zip([5, 6, 7], [1, 2, 3])]
3-element Vector{MyType}:
MyType(0, 0, 5, 1)
MyType(0, 0, 6, 2)
MyType(0, 0, 7, 3)
Run Code Online (Sandbox Code Playgroud)
另一种可能性(基于这个答案)是自己明确地进行广播调用:
julia> broadcast((cval, dval) -> MyType(c = cval, d = dval), [5, 6, 7], [1, 2, 3])
3-element Vector{MyType}:
MyType(0, 0, 5, 1)
MyType(0, 0, 6, 2)
MyType(0, 0, 7, 3)
Run Code Online (Sandbox Code Playgroud)
或((cval, dval) -> MyType(c = cval, d = dval)).([5, 6, 7], [1, 2, 3])
评论中提到的同等内容。
其中,在我看来,数组理解是最清晰、最明显的方法。