带有可选参数的 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
但是如果我只想指定前两个参数 a
和 b
,以及 c=1
和 d=2
,我将无法调用$:> julia foo.jl 1 2
的脚本,因为该脚本不包含带有 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...
设置一个默认值,如果它没有在终端中提供的话。像 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")
.
我有一个脚本 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
但是如果我只想指定前两个参数 a
和 b
,以及 c=1
和 d=2
,我将无法调用$:> julia foo.jl 1 2
的脚本,因为该脚本不包含带有 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...
设置一个默认值,如果它没有在终端中提供的话。像 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")
.