Вы уже сказали все, что есть в своем вопросе:
{...}
на самом деле является просто комбинацией двух описанных вами поведений: он создает таблицу, содержащую все аргументы, поэтому
function foo(a, b, ...)
return {...}
end
foo(1, 2, 3, 4, 5) --> {3, 4, 5}
По сути, ...
- это просто нормальное выражение, как и вызов функции, который возвращает несколько значений.Следующие два выражения работают точно так же:
local a, b, c = ...
local d, e, f = some_function()
Имейте в виду, что это имеет некоторые последствия для производительности, поэтому, возможно, не используйте его в функции, которая вызывается примерно 1000 раз в секунду;)
РЕДАКТИРОВАТЬ:
Обратите внимание, что это действительно не относится только к "функциям".Функции на самом деле являются скорее синтаксической функцией, чем все остальное.Под капотом Lua знает только куски, в которые превращаются обе функции и файлы .lua
.Итак, если вы запускаете скрипт Lua, весь скрипт превращается в кусок и поэтому не отличается от функции.
С точки зрения кода, разница в том, что с помощью функции вы можете указать имена для ееаргументы вне его кода, тогда как с файлом вы уже находитесь на внешнем уровне кода;«вне» файла нет.
К счастью, все файлы Lua, когда они загружаются как чанк, автоматически изменяются, то есть они получают ...
для доступа к списку аргументов.
Когда вы вызываете файл типа lua script.lua foo bar
, внутри script.lua, ...
будет фактически содержать два аргумента "foo" и "bar", так что это также удобный способ доступа к аргументам при использовании Lua для автономных скриптов.
В вашем примере это на самом деле очень похоже.Скорее всего, где-то еще ваш скрипт загружается с load()
, который возвращает функцию, которую вы можете вызвать - и, как вы уже догадались, передать аргументы.
Представьте себе следующую ситуацию:
function foo(a, b)
print(b)
print(a)
end
foo('hello', 'world')
Это почти эквивалентно
function foo(...)
local a, b = ...
print(b)
print(a)
end
foo('hello', 'world')
, что на 100% (за исключением, возможно, по производительности) эквивалентно
-- Note that [[ string ]] is just a convenient syntax for multiline "strings"
foo = load([[
local a, b = ...
print(b)
print(a)
]])
foo('hello', 'world')