使用可选的位置参数定义 Julia 函数

define Julia functions with optional positional arguments

从这个link,它说:

# You can define functions with optional positional arguments
function defaults(a,b,x=5,y=6)
    return "$a $b and $x $y"
end

defaults('h','g') # => "h g and 5 6"
defaults('h','g','j') # => "h g and j 6"
defaults('h','g','j','k') # => "h g and j k"
try
    defaults('h') # => ERROR: no method defaults(Char,)
    defaults() # => ERROR: no methods defaults()
catch e
    println(e)
end

我认为这个例子的目的是表明,如果提供的参数少于默认参数,函数也会return默认参数。

但是为什么在提供一个或不提供参数时会出现错误?即我怎么知道提供两个参数是可以的,但是提供一个或 none 是不行的?

答案很简单:

函数defaults需要至少提供两个参数(ab没有默认值), 因为语言规范不允许必需的位置参数出现在 "unknown state" 中。如果没有提供默认值,解释器会抛出异常。 Citing the manual,可选参数背后的设计原因

Optional arguments are actually just a convenient syntax for writing multiple method definitions with different numbers of arguments

就好像他们正在创造一些 "functions" 已经知道哪些是论点。你写:

defaults(a,b,x=5,y=6)

并且内部存在:

defaults(a, b, x, y)
defaults(a, b, x, 6)
defaults(a, b, 5, 6)

(请注意,我 不是在写 defaults(a, b, 5, y) 以保持讨论简单。

使用 3 个参数调用 defaults 是可以的,但是您将覆盖 x 的默认值。使用 4 个参数调用它是可以的,但是您将覆盖 xy 的默认值。用少于 2 个参数调用它是不行的,因为解释器不知道要 return 什么(因为你需要 ab 来插入 returned 字符串) .

您可以这样定义一个只需要一个位置参数的函数:

function defaults(a,b=4,x=5,y=6)
    return "$a $b and $x $y"
end

还有更多信息here