我是 Julia 的新手,只是想理解以下代码块。我知道
@with_kw
来自Parameters 包,允许我们设置结构变量的默认值以及 where
关键字的用途。但我真的不明白结构声明之后发生了什么,即
BackTracking{TF}(args...; kwargs...) etc
- 我们是否修改结构体的构造函数,合并“TF,Int”类型并将它们替换为一种类型“TF”?
我也不明白下面的函数定义——第一组括号是什么意思?这个函数是该结构的另一个构造函数吗?
@with_kw struct BackTracking{TF, TI}
iterations::TI = 1_000
ρ_hi::TF = 0.5
etc more varables
end
BackTracking{TF}(args...; kwargs...) where TF = BackTracking{TF,Int}(args...; kwargs...)
function (ls::BackTracking)(α_0::Tα = real(T)(1), etc more parameters) where {T, Tα}
some stuff
α_0 = min(α_0, min(alphamax, ls.maxstep / norm(s, Inf)))
ls(ϕ, α_0, ϕ_0, dϕ_0)
end
这条线
BackTracking{TF}(args...; kwargs...) where TF = BackTracking{TF,Int}(args...; kwargs...)
为类型
BackTracking
定义了一个新的构造函数方法。它使用短格式函数定义语法,相当于
function BackTracking{TF}(args...; kwargs...) where TF
return BackTracking{TF,Int}(args...; kwargs...)
end
如您所见,您只在这里提供第一个类型参数,因此实际上它表示如果您不提供第二个类型参数,它将使用
Int
作为该参数。换句话说,写 BackTracking{Float64}(...)
就相当于写 BackTracking{Float64, Int}(...)
。
最后一个函数定义使对象可调用。如果你创建一个对象
obj = BackTracking{Float64}(...)
,那么你可以将obj
视为一个函数,并像那样调用它
obj(x)