最好用一个例子来解释:
我定义了一个类型
type myType
?::Float64
?::Float64
end
z = myType( 1., 2. )
Run Code Online (Sandbox Code Playgroud)
然后假设我想将此类型作为参数传递给函数:
myFunc( x::Vector{Float64}, m::myType ) =
x[1].^m.?+x[2].^m.?
Run Code Online (Sandbox Code Playgroud)
有没有办法传递,myType
以便我可以以"更清洁"的方式在函数体中实际使用它,如下所示:
x[1].^?+x[2].^?
Run Code Online (Sandbox Code Playgroud)
谢谢你的回答.
一种方法是使用dispatch来实现更通用的功能:
myFunc( x::Vector{Float64}, ?::Float64, ?::Float64) = x[1].^?+x[2].^?
myFunc( x::Vector{Float64}, m::myType = myFunc(x,m.?,m.?)
Run Code Online (Sandbox Code Playgroud)
或者如果你的函数更长,你可能想要使用Parameters.jl @unpack
:
function myFunc( x::Vector{Float64}, m::myType )
@unpack m: ?,? #now those are defined
x[1].^?+x[2].^?
end
Run Code Online (Sandbox Code Playgroud)
解包的开销很小,因为你没有复制,它只是做了一堆?=m.?
只是?
指向哪一个m.?
.对于较长的方程式,如果你有很多字段并在长时间计算中使用它们,这可能是一个更好的形式(作为参考,我在DifferentialEquations.jl中经常使用它).
还有另一种方式,如评论中所述.让我说明一下.您可以使用@with_kw
Parameters.jl中的宏定义类型(使用可选的kwargs).例如:
using Parameters
@with_kw type myType
?::Float64 = 1.0 # Give a default value
?::Float64 = 2.0
end
z = myType() # Generate with the default values
Run Code Online (Sandbox Code Playgroud)
然后你可以使用@unpack_myType
宏自动生成的@with_kw
宏:
function myFunc( x::Vector{Float64}, m::myType )
@unpack_myType m
x[1].^?+x[2].^?
end
Run Code Online (Sandbox Code Playgroud)
同样,这只会产生无需复制的参考α和β的开销,因此它非常轻量级.
归档时间: |
|
查看次数: |
115 次 |
最近记录: |