首页 > 解决方案 > 使用 `Base.@kwdef` 广播结构创建

问题描述

如果我有一个大型结构,我想创建一个数组(例如稍后创建一个StructArray),那么当我有关键字默认值时如何创建一个结构数组。

例如

Base.@kwdef struct MyType
  a = 0
  b = 0
  c = 0
  d = 0
  ... # can be up to 10 or 20 fields
end

Base.@kwdef很好,因为我可以创建对象,MyType(b=10,e=5)但有时我有参数数组。我希望能够广播或简洁地构造一个结构数组。

那就是我希望以下将创建一个包含三个MyTypes 的数组:MyType.(c=[5,6,7],d = [1,2,3])

相反,它创建了一个MyTypewherecdare 数组而不是标量值。

有什么方法可以保持Base.@kwdef结构构造的便利性和简单性?

标签: julia

解决方案


似乎是一个很好的理解用例:

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)

另一种可能性(基于this answer)是自己明确地进行广播调用:

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)

((cval, dval) -> MyType(c = cval, d = dval)).([5, 6, 7], [1, 2, 3])或那里的评论中提到的等价物。

其中,数组理解在我看来是最清晰和最明显的方法。


推荐阅读