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

lan*_*bai 4 default-value julia positional-parameter

从这个链接,它说:

# 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
Run Code Online (Sandbox Code Playgroud)

我认为这个例子的目的是表明,如果提供的参数小于默认参数,该函数也将返回默认参数.

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

Mat*_*gni 5

答案很简单:

对于该函数defaults,需要提供至少两个参数(a并且b没有默认值),因为语言规范不允许所需的位置参数处于"未知状态".如果未提供默认值,则解释器会引发异常.引用手册,可选参数背后的设计原因:

可选参数实际上只是一种方便的语法,用于编写具有不同数量参数的多个方法定义

这就像他们正在创建一些已经知道哪些是参数的"函数".你写:

defaults(a,b,x=5,y=6)
Run Code Online (Sandbox Code Playgroud)

内部存在:

defaults(a, b, x, y)
defaults(a, b, x, 6)
defaults(a, b, 5, 6)
Run Code Online (Sandbox Code Playgroud)

(并注意到我不是 defaults(a, b, 5, y)为了让讨论变得简单而写作).

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

您可以通过以下方式定义一个只需要一个位置参数的函数:

function defaults(a,b=4,x=5,y=6)
    return "$a $b and $x $y"
end
Run Code Online (Sandbox Code Playgroud)

也有更多的信息在这里.