#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.)
в функции по умолчанию. Это то, что я объясняю в своем вопросе.