선택적 인수가있는 Varargs 함수

Aug 20 2020

foo.jl4 개의 인수를 사용할 수있는 함수 가있는 스크립트 가 있는데 그중 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=1그리고 d=2, 내가 가진 스크립트를 호출 할 수 없을 것입니다 $:> julia foo.jl 1 2스크립트가 2 개 인자로 함수 호출을 포함하지 않기 때문에. 해결 방법은 ARGSin 의 길이를 측정 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)가 필요하고 나머지는 선택 사항이며 기본값으로 설정됩니다.

답변

2 PrzemyslawSzufel Aug 20 2020 at 07:12

아마도 다음 기능을 찾고 계실 것입니다.

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").