在 julia 中的 slurping 运算符 (args...) 之后调度参数
Dispatching on arguments after the slurping operator (args...) in julia
你会如何实现这样的功能:
function foo(a,b...,c)
println(a,b,c)
end
foo(2,3,3,"last")
=> a = 2 , b = (3,3) , c = "last"
我不能使用类似的东西:
function foo(a,b...)
c = b[end]
println(a,b,c)
end
因为我想在c上调度,
IE。
我想要方法:
foo(a,b...,c::Foo)
和
foo(a,b...,c::Bar)
我也不能有这样的东西:
foo_wrapper(a,b...) = foo(a,b[1:end-1],b[end])
因为我一般也想在 foo 上调度。
这有可能吗?
唯一的选择是将 c
作为关键字参数,例如:
function foo(a,b...;c)
println(a," ",b," ",c)
end
现在您可以:
julia> foo(1,2,3;c="aa")
1 (2, 3) aa
您可以颠倒顺序,然后在辅助函数上分派:
function foo(a,d...)
c = last(d)
b = d[begin:end-1]
return _foo(a,c,b...)
end
function _foo(a,c::Int,b...)
return c+1
end
function _foo(a,c::Float64,b...)
return 2*c
end
在 REPL 中:
julia> foo(1,2,3,4,5,6)
7
julia> foo(1,2,3,4,5,6.0)
12.0
julia> foo(1,2,8.0)
16.0
julia> foo(1,90) #b is of length zero in this case
91
你会如何实现这样的功能:
function foo(a,b...,c)
println(a,b,c)
end
foo(2,3,3,"last")
=> a = 2 , b = (3,3) , c = "last"
我不能使用类似的东西:
function foo(a,b...)
c = b[end]
println(a,b,c)
end
因为我想在c上调度, IE。 我想要方法:
foo(a,b...,c::Foo)
和
foo(a,b...,c::Bar)
我也不能有这样的东西:
foo_wrapper(a,b...) = foo(a,b[1:end-1],b[end])
因为我一般也想在 foo 上调度。
这有可能吗?
唯一的选择是将 c
作为关键字参数,例如:
function foo(a,b...;c)
println(a," ",b," ",c)
end
现在您可以:
julia> foo(1,2,3;c="aa")
1 (2, 3) aa
您可以颠倒顺序,然后在辅助函数上分派:
function foo(a,d...)
c = last(d)
b = d[begin:end-1]
return _foo(a,c,b...)
end
function _foo(a,c::Int,b...)
return c+1
end
function _foo(a,c::Float64,b...)
return 2*c
end
在 REPL 中:
julia> foo(1,2,3,4,5,6)
7
julia> foo(1,2,3,4,5,6.0)
12.0
julia> foo(1,2,8.0)
16.0
julia> foo(1,90) #b is of length zero in this case
91