带有可选参数的 Varargs 函数

Varargs function with optional arguments

我有一个脚本 foo.jl,它的函数可以接受 4 个参数,其中 2 个是可选的。我可以用

轻松做到这一点
function bar(a, b, c=1, d=2)
    println(a, b, c, d)
end

bar(ARGS[1], ARGS[2], ARGS[3], ARGS[4])

我可以使用来自终端的参数调用它

$:> julia foo.jl 1 2 3 4
1234

但是如果我只想指定前两个参数 ab,以及 c=1d=2,我将无法调用$:> julia foo.jl 1 2 的脚本,因为该脚本不包含带有 2 个参数的函数调用。解决方法是测量 foo.jlARGS 的长度并有条件地调用 bar:

if length(ARGS) == 2
    bar(ARGS[1], ARGS[2])
elseif length(ARGS) == 3
    bar(ARGS[1], ARGS[2], ARGS[3])
else
    bar(ARGS[1], ARGS[2], ARGS[3], ARGS[4])
end

但是当超过 4 个参数时,这有点笨重。所以我研究了使用可变参数,在那里我可以用

调用任意数量的参数
function bar(a, b, x...)
    println(a, b, x)
end

bar(ARGS[1], ARGS[2], ARGS[3:end])

以多种方式调用它

$:> julia foo.jl 1 2
12(String[],)
$:> julia foo.jl 1 2 3 4
12(["3", "4"],)
$:> julia foo.jl 1 2 3 4 5 6
12(["3", "4", "5", "6"],)

但是我不知道如何(或者如果我能够)为 x... 设置一个默认值,如果它没有在终端中提供的话。像 function bar(a, b, x...=(1, 2)) 这样幼稚的东西是行不通的。这里的解决方案是根据 x... 的内容或大小在函数内设置变量。但是不知道有没有更好的方法。

所以我正在寻找一种使用终端参数调用函数的方法,其中需要一个数字(在本例中为 2),而其余的是可选的并设置为默认值。

也许您正在寻找以下功能:

function flexiargs(a1,a2,a3="3",a4="4",a5="5",a6...)
    println((a1,a2,a3,a4,a5,a6))
end
flexiargs(args::AbstractVector)=flexiargs(args...)

只要至少有两个参数,此函数就可以使用任意数量的参数。

让我们用以下数据进行测试:

args0=["one","two"]
args1=["one","two","three","four"];
args2=vcat(args,"five","six","seven") 

让我们看看它是如何工作的:

julia> flexiargs(args0)
("one", "two", "3", "4", "5", ())

julia> flexiargs(args1)
("one", "two", "three", "four", "5", ())

julia> flexiargs(args2)
("one", "two", "three", "four", "five", ("six", "seven"))

最后注意一下,这样也行:

function flexiargs(a1,a2,a3="3",a4="4",a5="5",a6...=("6","7"))
    println((a1,a2,a3,a4,a5,a6))
end
flexiargs(args::AbstractVector)=flexiargs(args...)

在这种情况下,默认情况下(如果 args 中没有足够的值)a6 将只是一个元素 Tuple,唯一的元素是 Tuple ("6","7").