N длинный кортеж в качестве необязательного аргумента

#julia

#julia

Вопрос:

Я хотел бы иметь N длинный кортеж в качестве необязательного аргумента функции, но я не знаю, как предоставить N длинное значение по умолчанию:

 function create_grid(d::Int64, n::Tuple{Vararg{Int64, N}}; xmin::Tuple{Vararg{Float64, N}}) where N
  

Я понимаю xmin , что он должен быть объявлен со значением по умолчанию, таким как xmin::Tuple{Vararg{Float64, N}}::0. , но это, очевидно, неправильно, поскольку по умолчанию используется значение a Float вместо Tuple . Как я могу указать, что мне нужен N длинный кортеж в качестве необязательного аргумента по умолчанию (например.) 0. для всех элементов, если аргумент не указан явно?

Ответ №1:

Вот оно — вы просто указываете значение по умолчанию как одноэлементный кортеж:

 function somefun(d::Int64, n::Tuple{Vararg{Int64, N}}; xmin::Tuple{Vararg{Float64, N}}=(0.0,)) where N
    println("d=$d n=$n xmin=$xmin")
end
  

Чтобы понять, как это работает, просто обратите внимание, что:

 Tuple{Vararg{Int, 2}} == typeof((2,2)) 
#and
Tuple{Vararg{Int, 1}} == typeof((2,))
  

итак, вам нужен 1-элементный кортеж по умолчанию.

Давайте протестируем это:

 julia> somefun(4,(4,))
d=4 n=(4,) xmin=(0.0,)
  

Это работает, как и ожидалось.

Наконец, обратите внимание, что предоставление 2-элементного кортежа в качестве второго аргумента без третьего приведет к ошибке, поскольку размеры не совпадают:

 julia> somefun(4,(4,5))
ERROR: MethodError: no method matching #somefun#1(::Tuple{Float64}, ::typeof(somefun), ::Int64, ::Tuple{Int64,Int64})
  

Если вы хотите обойти это, вам нужен другой конструктор:

 function somefun(d::Int64, n::Tuple{Vararg{Int64, N}}; xmin::Tuple{Vararg{Float64, N}}= tuple(zeros(length(n))...)) where N
    println("d=$d n=$n xmin=$xmin")
end
  

Тестирование:

 julia> somefun(4,(4,5))
d=4 n=(4, 5) xmin=(0.0, 0.0)
  

Комментарии:

1. Проблема в том, что я хочу иметь возможность вызывать somefun(4,(4,5)) , без xmin и затем xmin должен быть (0.,0.) в функции по умолчанию. Это то, что я объясняю в своем вопросе.