Flatten.jl was made entirely to do this! Even for nested structs.
Like:
using Flatten
import Flatten: flattenable
@flattenable @with_kw struct Para{T}
a::T = 1.0 | true
b::T = 2.0 | true
c::T = 3.0 | false
end
julia> para = Para()
Para{Float64}
a: Float64 1.0
b: Float64 2.0
c: Float64 3.0
julia> fieldnameflatten(para)
(:a, :b)
julia> data = flatten(Vector,para)
2-element Array{Float64,1}:
1.0
2.0
julia> data[2] = 5.0
5.0
julia> Flatten.reconstruct(para, data)
Para{Float64}
a: Float64 1.0
b: Float64 5.0
c: Float64 3.0
It becomes increasingly useful the larger and more complicated the struct, and it generates pretty fast code.
To use the fieldnames in the array, make an AxisArray
data = flatten(Vector,para)
names = fieldnameflatten(Vector, para)
a = AxisArray(data, Axis{:parameters}(names))
julia> a[:b]
2.0