调用函数时声明参数名称

ecj*_*cjb 4 arguments function keyword-argument julia

Julia 1.4.0我有以下功能:

function output(W::Int64,F::Int64,P::Int64,S::Int64)
       return ((W-F+2*P)/S +1)
       end
Run Code Online (Sandbox Code Playgroud)

当我输入以下命令时,输出如预期

julia> output(28,5,0,1)
24.0
Run Code Online (Sandbox Code Playgroud)

现在,为了确定哪个参数是什么,我在调用函数时明确命名它们的名称(如果可能的话,如果可以以不同的顺序编写参数,这可能会有所帮助)

julia> output(W=28,F=5,P=0,S=1)
ERROR: MethodError: no method matching output(; W=28, F=5, P=0, S=1)
Closest candidates are:
  output(::Int64, ::Int64, ::Int64, ::Int64) at REPL[23]:2 got unsupported keyword arguments "W", "F", "P", "S"
  output(::Any, ::Any, ::Any, ::Any) at REPL[2]:2 got unsupported keyword arguments "W", "F", "P", "S"
Stacktrace:
 [1] top-level scope at REPL[25]:1
Run Code Online (Sandbox Code Playgroud)

其他类似的方法可能吗?

ARa*_*rez 5

您想为您的函数使用关键字参数(您可以在 Julia 文档中阅读有关关键字参数的更多信息)

要使用关键字参数声明函数,您应该这样做(注意参数前的分号):

function output(;W::Int64,F::Int64,P::Int64,S::Int64)
       return ((W-F+2*P)/S +1)
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要运行您的函数:

julia> output(W=28,F=5,P=0,S=1)
24.0
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的问题 - 关于“;”的问题是它将位置参数与关键字参数分开,并且只有位置参数参与方法分派(参见此处的讨论:https://discourse.julialang.org/t/rules- for-method-dispatch-with-keyword-arguments/23626/3)。为了说明这一点,请考虑 `f(x::Number) = "a number!"; 之间的区别 f(x::Int) = "一个整数!"` 和 `g(;x::Number) = "一个数字"; g(;x::Int) = "一个整数"`。您会发现,对于“g”,只有一个方法存在,因为第二个方法覆盖了第一个方法,而对于“f”,有一个“Int”方法和一个“Float”方法 (2认同)