我有类似以下的内容
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
,则必须拥有有效值。
答案 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
,因此不返回此元素。