Как заставить функцию принимать динамические аргументы? - PullRequest
2 голосов
/ 07 ноября 2019

При работе с функцией (v1, v2, v3) или функцией (...), похоже, не существует хорошего способа обработки изменений в месте расположения аргументов при вызове функции.

Пример функции:

my_function(v1,v2,v3) {
  print(v1, v2, v3)
}

Пример аргументов Функция:

my_args_func(...) {
  local arg = {...}
  for i,v in ipairs(arg) do
    print(v)
  end
}

Из приведенных выше 2 примеров вы можете сделать

my_function(set1,set2,set3)
my_arg_func(set1,set2,set3)

Но если вы хотите внести изменениядля любого из них управление всеми обновлениями параметров функций становится одним и тем же делом.

Скажем, мы хотим добавить новое значение для обеих функций. newval10.

my_function () мы были бы вынуждены положить его в конец, как my_function (v1, v2, v3, newval10), иначе все не будет работать правильно, если мы не обновим и вызов, и функциюпараметры, которые он принимает.

То же самое касается func (...), где мы знаем только значение индекса и фактическое значение. не то, что они представляют. Есть ли способ иметь такую ​​функцию, как

local my_generic_func(...) {
  -stuff goes here
}
if my_generic_func(v1,v2,v3) then return end

, которая может быть обновлена ​​с помощью my_generic_func (v1, v5, v3, v4, v2), и функция будет знать, где на самом деле находится каждое значение.

1 Ответ

0 голосов
/ 08 ноября 2019

Вам нужно дать функции один параметр с любым именем, а затем использовать его в качестве остальных аргументов.

local function generic(par)
  _generic(par.arg1 or 0, --sets a default value of 0
    par.arg2 or "arg2",
    par.arg3 --default is "false" or "nil"
  )
end

Использование этого будет следующим:

a = generic{12,"alpha"} --note the use of curly braces

Что бы выполнять функцию generic с аргументами 12, "alpha" и значением по умолчанию nil.

Чтобы конкретно указать, какую переменную вы устанавливаете, вы можете сделать:

a = generic{arg1=12,arg2="alpha"}

И не имеет значения, в каком порядке вы помещаете arg1 / arg2.

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

По сути, это ввод таблицы в функцию с одним параметром, а затем получение информации из этой таблицы, а не из нескольких параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...