如何缩短函数体中的类型

Dim*_*ris 2 julia

最好用一个例子来解释:

我定义了一个类型

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)

谢谢你的回答.

Chr*_*kas 7

一种方法是使用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_kwParameters.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)

同样,这只会产生无需复制的参考α和β的开销,因此它非常轻量级.

  • 是.[文档](http://parametersjl.readthedocs.io/en/latest/manual/)解释说,如果您使用`@with_kw`定义了类型,那么将会定义一个神奇的小`@ unpack_MyType`.然后你只需要`@unpack_MyType m`它将解压缩类型. (2认同)