Если ваш n
небольшой, вы можете сделать это вручную благодаря множественной диспетчеризации.
julia> f(x) = x + 1 # Method definition for one variable.
f (generic function with 1 method)
julia> f(x, y) = x + y + 1 # Method definition for two variables.
f (generic function with 2 methods)
julia> f(2)
3
julia> f(2, 4)
7
Вы можете использовать макропрограммирование для автоматического создания набора этих методов, но это быстро усложняется. Вероятно, вам лучше структурировать свою функцию так, чтобы она работала либо с Vector
, либо с Tuple
произвольной длины. Определение функции будет зависеть от того, что вы хотите сделать. Некоторые примеры, которые предполагают, что x
будет Tuple
, Vector
или другим подобным типом данных, приведены ниже.
julia> g(x) = sum(x) # Add all the elements
g (generic function with 1 method)
julia> h(x) = x[end - 1] # Return the second to last element
h (generic function with 1 method)
julia> g([10, 11, 12])
33
julia> h([10, 11, 12])
11
Если вы предпочитаете, чтобы функция принимала произвольное количество входных данных, а не один Tuple
или Vector
, как вы написали в исходном вопросе, вам следует определить метод для функций с оператором ...
, как показано ниже. Обратите внимание, что тела определений функций и выходные данные функций точно такие же, как и раньше. Таким образом, хлюпающий оператор ...
используется только для синтаксического удобства. Приведенные ниже функции по-прежнему работают на Tuple
x
. Аргументы функции просто вводятся в кортеж, прежде чем делать что-либо еще. Также обратите внимание, что вы можете одновременно определить оба вышеуказанных и приведенных ниже метода, чтобы пользователь мог выбрать любой метод ввода.
julia> g(x...) = sum(x) # Add all the variables
g (generic function with 2 methods)
julia> h(x...) = x[end - 1] # Return the second to last variable
h (generic function with 2 methods)
julia> g(10, 11, 12)
33
julia> h(10, 11, 12)
11
Наконец, еще один прием, который иногда бывает полезен, заключается в рекурсивном вызове функции. Другими словами, чтобы функция вызывала сама себя (возможно, используя другой метод).
julia> q(x) = 2 * x # Double the input
q (generic function with 1 method)
julia> q(x...) = q(sum(x)) # Add all the inputs and call the function again on the result
q (generic function with 2 methods)
julia> q(3)
6
julia> q(3, 4, 5)
24
person
Nathan Boyer
schedule
23.02.2021