如何在 Julia 中为可变结构设置默认参数?

Posted

技术标签:

【中文标题】如何在 Julia 中为可变结构设置默认参数?【英文标题】:How can I set default parameters for mutable structs in Julia? 【发布时间】:2021-01-28 21:57:42 【问题描述】:

有没有办法在 Julia 中为可变结构添加默认参数?

我正在尝试编写如下内容:

mutable struct Scale
    # Set default values that will be changed by fit!()
    domain_min::Float64 = 0.0
    domain_max::Float64 = 1.0
    range_min::Float64  = 0.0 
    range_max::Float64  = 1.0
end

function fit!(data::Array)
    # Set struct params here using `data`
end

有没有办法做到这一点,还是我应该尝试不同的方法?

【问题讨论】:

【参考方案1】:

这正是Base.@kwdef 所做的:

julia> Base.@kwdef mutable struct Scale
           # Set default values that will be changed by fit!()
           domain_min::Float64 = 0.0
           domain_max::Float64 = 1.0
           range_min::Float64  = 0.0 
           range_max::Float64  = 1.0
       end
Scale

# All parameters to their default values
julia> Scale()
Scale(0.0, 1.0, 0.0, 1.0)

# Specify some parameter(s) using keyword argument(s)
julia> Scale(range_min = 0.5)
Scale(0.0, 1.0, 0.5, 1.0)

【讨论】:

从技术上讲,Base.@kwdef 是一个内部宏,因此可能会发生变化(尽管它在野外被大量使用)。可能值得一提的是Parameters.jl,它有一个公共且稳定的接口,用于基本相同的事情。 FWIW,还有FieldDefaults.jl。【参考方案2】:

我更喜欢使用Parameters.jl,因为它还提供了一种更好的显示structs 的方式,更便于调试:

julia> using Parameters

julia> @with_kw struct A          
       a::Int=5                   
       b::String="hello"          
       c::Float64                 
       end;                                 
                                  
julia> A(c=3.5)                   
A                                 
  a: Int64 5                      
  b: String "hello"               
  c: Float64 3.5                  

【讨论】:

【参考方案3】:

或者您也可以自行使用构造函数定义它,如果您想以多种可能的方式实例化它,通常会这样做。

mutable struct Scale                                                                                                                                                                                                                          
    # Set default values that will be changed by fit!()
    domain_min::Float64      
    domain_max::Float64      
    range_min::Float64        
    range_max::Float64       
end

# With default values, but no keywords
julia> Scale(dmin=1.,dmax=2.,rmin=1.,rmax=2.) = Scale(dmin, dmax, rmin, rmax)
Scale

julia> Scale(3.,4.)
Scale(3.0, 4.0, 1.0, 2.0)

# With keyword arguments:
julia> Scale(;dmin=1.,dmax=2.,rmin=1.,rmax=2.) = Scale(dmin, dmax, rmin, rmax)
Scale

julia> Scale(rmax=3., rmin=1.2)
Scale(1.0, 2.0, 1.2, 3.0)

注意两个构造函数之间的区别,一个有分号;,另一个没有。我不建议同时使用这两个构造函数,这可能会导致一些混乱。

【讨论】:

以上是关于如何在 Julia 中为可变结构设置默认参数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥结构和可变结构具有不同的默认相等运算符?

如何在 Ruby 中为 splat 参数设置默认值

如何在 Solidity 中为函数设置默认参数

matlab 可变参数与默认参数设置

函数不匹配语言版本迁移中的参数,以及如何知道函数的签名

如何在机器人框架中传递默认的可变参数?