如何将 Julia 结构完全解压到局部变量中?

Prz*_*fel 5 struct metaprogramming julia

我创建了一个包含大量参数的复杂计算模型。由于我需要运行许多场景,因此我决定将所有这些输入参数包装成一个巨大的struct

using Parameters
@with_kw struct MyModel
    a::Int = 5
    b::Float64 = 5.5
    c::Matrix{Float64} = rand(3,4)
    # 40 other parameters go here
end
Run Code Online (Sandbox Code Playgroud)

我有一个对象m作为例子:

m = MyModel(a=15)
Run Code Online (Sandbox Code Playgroud)

现在,在编写数学代码时,我不想m.在每个符号前面都写。因此我需要将结构体字段放入局部变量中。一种方法是使用@unpack宏:

@unpack a, b, c = m
Run Code Online (Sandbox Code Playgroud)

对于我想要在各种函数中解压的巨大结构体来说,这很不方便(请注意,我的结构体有大约 40 个字段)。如何解压该结构而不花费时间并用所有这些参数使我的代码变得混乱?

mca*_*ott 4

Parameters.jl 中的宏@with_kw为此目的定义了一个宏:

julia> using Parameters

julia> @with_kw struct MyModel  # exactly as in the question
           a::Int = 5
           b::Float64 = 5.5
           c::Matrix{Float64} = rand(3,4)
           # 40 other parameters go here
       end
MyModel

julia> @macroexpand @unpack_MyModel x
quote
    a = x.a
    b = x.b
    c = x.c
end
Run Code Online (Sandbox Code Playgroud)

因此,当你知道这一点时,写作@unpack_MyModel m就等同于写作。@unpack a, b, c = mm isa MyModel

  • 我想这是希望包超过“Base.@kwdef struct MyModel”的原因之一,但它不会这样做。 (2认同)