Julia将可选参数传递给内部函数调用

时间:2016-05-03 22:27:19

标签: julia

我有类似以下的内容

function test(; testvar=nothing)
   # only pass testvar to function if it has a useful value
   inner_function(testvar != nothing ? testvar2=testvar : # leave it out)
end

# library function, outside my control, testvar2 can't be nothing
function inner_function(; testvar2=useful value)
   # do something
end

我知道我可以在test()中使用if / else语句,但inner_function有很多参数,所以我宁愿从代码重复的角度来避免这种情况。这可能吗?

注意: inner_function 无法拥有testvar2 = nothing,如果传递testvar2,则必须拥有有效值。

1 个答案:

答案 0 :(得分:1)

正如@elsuizo指出的那样,多个调度是允许您执行此类操作的核心julia功能之一。下面是一个简单的例子:

>>> inner_func(x) = true;
>>> inner_func(::Type{Void}) = false;

注意:似乎Nothing已重命名为Void(当我尝试使用它时会出现警告提示)。

inner_func有2个方法定义,如果Void作为参数传递,则函数将返回false(通过不做任何事情来改变此行为或无论你想做什么)。相反,如果函数接收到除Void以外的任何内容,它将只执行其他操作(在这种情况下,返回true)。

您的test根本不需要执行任何检查。只需将参数传递给inner_func,它将根据参数类型决定做什么(函数inner_func的两个方法中的哪一个)。

一个例子:

>>> a = [1, 2, 3, Void, 5];
>>> filter(inner_func, a)
4-element Array{Any,1}:
 1
 2
 3
 5

对于数字元素,该函数调用返回true的函数的方法,因此返回数字元素。对于Void元素,调用函数的第二个方法,返回false,因此不返回此元素。