从字典初始化不可变结构

时间:2019-12-09 02:04:12

标签: dictionary struct parameters julia

我有一个具有默认值的不可变结构(感谢Parameters.jl),我想根据已有的字典(最初来自JSON文件)创建该结构的实例。但是,虽然我知道这些词典中可能的键集,但并不是每个词典都具有相同的键。我正在努力弄清楚如何通过算法将这些命令转换为我不可变结构的实例。我该怎么办?

例如,我有:

@with_kw struct Mystruct
    id::String
    mass::Float64
    names::Vector{String}=Vector{String}()
    elements::Vector{String}=Vector{String}()
end

和许多字典,每个字典可以有不同的键。它们都将具有idmass(这就是为什么它们没有默认值的原因),但是每个字典可能有也可能没有nameselements

如果我使用可变结构,这似乎很容易,因为我可以初始化实例,然后在事实之后使用setfield!,但是似乎没有办法在可变结构被“初始化”之前。

相关:Pass arguments to @kwdef struct programmatically

1 个答案:

答案 0 :(得分:5)

对于这种不带参数的简单结构,您可以像这样构造一个新的结构:

julia> kwargs = Dict(:id=>"test", :mass=> 1.)
Dict{Symbol,Any} with 2 entries:
  :id   => "test"
  :mass => 1.0

julia> Mystruct(;kwargs...)
Mystruct
  id: String "test"
  mass: Float64 1.0
  names: Array{String}((0,))
  elements: Array{String}((0,))