调用函数时声明参数的名称

5
在Julia 1.4.0中,我有以下函数:
function output(W::Int64,F::Int64,P::Int64,S::Int64)
       return ((W-F+2*P)/S +1)
       end

当我输入以下命令时,输出与预期一致。
julia> output(28,5,0,1)
24.0

现在,为了确保每个参数的含义,我希望在调用函数时显式命名它们(如果可以按不同顺序编写参数,则这将非常有帮助)。
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

是否有其他类似的方法可行?

1个回答

5

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

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

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

然后,您可以按照您想要的方式运行函数:

julia> output(W=28,F=5,P=0,S=1)
24.0

非常感谢@ARamirez。确实有效。您知道使用分号声明函数的优点是什么吗?为什么不只有一种声明函数的方式(没有那个分号)? - ecjb
2
这是一个好问题 - 关于 ; 的事情是它将位置参数与关键字参数分开,只有位置参数参与方法调度(例如,请参见此处的讨论:https://discourse.julialang.org/t/rules-for-method-dispatch-with-keyword-arguments/23626/3)。为了说明这一点,请考虑 f(x::Number) = "a number!"; f(x::Int) = "an integer!"g(;x::Number) = "a number"; g(;x::Int) = "an integer" 之间的区别。您会发现,对于 g,只存在一个方法,因为第二个方法覆盖了第一个方法,而对于 f,存在一个 Int 方法和一个 Float 方法。 - Nils Gudat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接