8

你将如何实现这样的功能:

function foo(a,b...,c)
    println(a,b,c)
end
foo(2,3,3,"last")

=> a = 2 , b = (3,3) , c = "最后"

我不能使用类似的东西:

function foo(a,b...) 
    c = b[end]
    println(a,b,c)
end

因为我想在c上调度,即我想要方法:

foo(a,b...,c::Foo)

foo(a,b...,c::Bar)

我也不能有这样的东西:

foo_wrapper(a,b...) = foo(a,b[1:end-1],b[end])

因为我也想在 foo 上进行调度。

这有可能吗?

4

2 回答 2

1

您可以颠倒顺序,然后在辅助功能上分派:

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
于 2021-12-19T04:33:09.060 回答
0

唯一的选择是c作为关键字参数,例如:

function foo(a,b...;c)
    println(a," ",b," ",c)
end

现在你可以这样做:

julia> foo(1,2,3;c="aa")
1 (2, 3) aa
于 2021-12-19T01:54:15.557 回答