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

8

从这个链接中,它说:

# 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

我认为这个例子的目的是展示,如果提供的参数少于默认值,函数也会返回默认值。
但是为什么当提供一个或零个参数时会出现错误呢?即如何知道提供两个参数是可以的,但提供一个或零个参数是不可以的?
1个回答

8
答案非常简单:对于函数defaults,至少需要提供两个参数(ab没有默认值),因为语言规范不允许必需的位置参数处于“未知状态”。如果没有提供默认值,解释器将引发异常。引用手册,可选参数的设计原因如下:

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

就像它们正在创建一些已经知道哪些是参数的“函数”。您可以编写:
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个参数调用是可以的,但会覆盖x和y的默认值。少于2个参数的调用是不可以的,因为解释器不知道该返回什么(因为需要a和b来插入返回的字符串)。
您可以按以下方式定义一个只需要一个位置参数的函数:
function defaults(a,b=4,x=5,y=6)
    return "$a $b and $x $y"
end

还有更多信息也在这里


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