Julia 带有可选参数的Varargs函数

Julia 带有可选参数的Varargs函数,julia,variadic-functions,optional-parameters,Julia,Variadic Functions,Optional Parameters,我有一个脚本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 但是如果我只想用c=1和d=2指定前两个参数a和b,我将无法用$:>julia foo.jl 2调用脚本,因为脚

我有一个脚本
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
但是如果我只想用
c=1
d=2
指定前两个参数
a
b
,我将无法用
$:>julia foo.jl 2
调用脚本,因为脚本不包含带有两个参数的函数调用。解决方法是测量
foo.jl
ARGS
的长度,并有条件地调用
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..设置默认值。
。像
功能条(a,b,x..=(1,2))
这样的简单方法不起作用。这里的解决方案是根据
x..
的内容或大小设置函数内部的变量。但我不知道是否有更好的方法


因此,我正在寻找一种使用terminal中的参数调用函数的方法,其中需要一个数字(本例中为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”),

这就成功了!我需要的关键部分是
flexiargs(args::AbstractVector)=flexiargs(args…
,现在我可以调用
函数flexiargs(a1,a2,a3…=(“3”,“4”))println((a1,a2,a3))end flexiargs(args::AbstractVector)=flexiargs(args…
,这正是我想要的!谢谢