선택적 인수가있는 Varargs 함수
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 개 인자로 함수 호출을 포함하지 않기 때문에. 해결 방법은 ARGS
in 의 길이를 측정 foo.jl
하고 조건부로 호출하는 것입니다 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")
.