如何在 Julia 中 initialize/construct 深层嵌套结构?
How to initialize/construct deep nested structs in Julia?
我想创建一些更深层次的嵌套结构。 Setfield.jl 包似乎足以填满它们。但是我正在努力初始化(空)结构以稍后迭代地填充它们。这些结构看起来像:
struct Bands
B0::String
B1::String
B2::String
B3::String
B4::String
B5::String
.
.
.
B25::String
end
struct Masks
mask1::Bands
mask2::Bands
mask3::Bands
mask4::Bands
mask5::Bands
mask6::String
end
我已经尝试过内部构造函数并按照此处所述https://docs.julialang.org/en/v1/manual/constructors/#Incomplete-Initialization-1. It seems that I have to set all values before like described at https://jw3126.github.io/Setfield.jl/stable/intro/。
如何初始化嵌套结构,在这种情况下一次初始化 131 个值?
例如,您可以创建默认构造函数,这些构造函数只为您以后可以更新的所有字段放置空对象
julia> struct Bands
B0::String
B1::String
# Create a constructor that puts an empty String ("") for each field
Bands() = new(("" for _ in 1:length(fieldnames(Bands)))...)
# Define a vararg constructor
Bands(args...) = new(args...)
end
julia> struct Masks
mask1::Bands
mask2::Bands
# Create a constructor that puts an empty Bands (Bands()) for each field
Masks() = new((Bands() for _ in 1:length(fieldnames(Masks)))...)
# Define a vararg constructor
Masks(args...) = new(args...)
end
julia> masks = Masks()
Masks(Bands("", ""), Bands("", ""))
julia> using Setfield
julia> masks = @set masks.mask1 = Bands("hello", "world") # Set a field of masks
Masks(Bands("hello", "world"), Bands("", ""))
julia> masks = @set masks.mask2.B0 = "hello" # Set a field of masks.mask2
Masks(Bands("hello", "world"), Bands("hello", ""))
对于您使用 Parameters.jl
的场景,代码会更简洁(此外,由于 String
是不可变的,因此您的 Bands
struct
需要可变。
using Parameters
@with_kw mutable struct Bands
B0::String = ""
B1::String = ""
end
@with_kw struct Masks
mask1::Bands = Bands()
mask2::Bands = Bands()
end
通过这种方式,您的代码干净、可读,并且您不需要定义大量的构造函数。
我想创建一些更深层次的嵌套结构。 Setfield.jl 包似乎足以填满它们。但是我正在努力初始化(空)结构以稍后迭代地填充它们。这些结构看起来像:
struct Bands
B0::String
B1::String
B2::String
B3::String
B4::String
B5::String
.
.
.
B25::String
end
struct Masks
mask1::Bands
mask2::Bands
mask3::Bands
mask4::Bands
mask5::Bands
mask6::String
end
我已经尝试过内部构造函数并按照此处所述https://docs.julialang.org/en/v1/manual/constructors/#Incomplete-Initialization-1. It seems that I have to set all values before like described at https://jw3126.github.io/Setfield.jl/stable/intro/。 如何初始化嵌套结构,在这种情况下一次初始化 131 个值?
例如,您可以创建默认构造函数,这些构造函数只为您以后可以更新的所有字段放置空对象
julia> struct Bands
B0::String
B1::String
# Create a constructor that puts an empty String ("") for each field
Bands() = new(("" for _ in 1:length(fieldnames(Bands)))...)
# Define a vararg constructor
Bands(args...) = new(args...)
end
julia> struct Masks
mask1::Bands
mask2::Bands
# Create a constructor that puts an empty Bands (Bands()) for each field
Masks() = new((Bands() for _ in 1:length(fieldnames(Masks)))...)
# Define a vararg constructor
Masks(args...) = new(args...)
end
julia> masks = Masks()
Masks(Bands("", ""), Bands("", ""))
julia> using Setfield
julia> masks = @set masks.mask1 = Bands("hello", "world") # Set a field of masks
Masks(Bands("hello", "world"), Bands("", ""))
julia> masks = @set masks.mask2.B0 = "hello" # Set a field of masks.mask2
Masks(Bands("hello", "world"), Bands("hello", ""))
对于您使用 Parameters.jl
的场景,代码会更简洁(此外,由于 String
是不可变的,因此您的 Bands
struct
需要可变。
using Parameters
@with_kw mutable struct Bands
B0::String = ""
B1::String = ""
end
@with_kw struct Masks
mask1::Bands = Bands()
mask2::Bands = Bands()
end
通过这种方式,您的代码干净、可读,并且您不需要定义大量的构造函数。