julia - 使用 `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)
但有时我有参数数组。我希望能够广播或简洁地构造一个结构数组。
那就是我希望以下将创建一个包含三个MyType
s 的数组: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)
另一种可能性(基于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])
或那里的评论中提到的等价物。
其中,数组理解在我看来是最清晰和最明显的方法。
推荐阅读
- python-3.x - 使用 Python 更改具有多个 ExcelSheet 的工作簿中特定列中的值?
- mysql - 计数重复的电子邮件并在忽略大小写时显示计数
- html - 登录和订阅成功后重定向到新的 Angular 应用程序
- ssl - Python 请求未在 HTTPS 会话上附加客户端证书
- sql - 如何在 POWERSHELL 中运行以特定名称开头但我不知道名称的后半部分的 sql 脚本?
- oracle-apex - 在 oracle apex 中使用自定义身份验证重置密码
- laravel - Graph API (#4) 达到应用程序请求限制 | Facebook评论插件如何通过一个请求从应用程序中获取所有评论
- makefile - 如何在 Makefile 中获取当前目录的父目录名称?
- python - Windows 10 中的 Python 帮助和自动完成功能
- python - pyqt5 python调用另一个类的函数