Если вам нужны именованные аргументы и значения по умолчанию, такие как PHP или Python, вы можете вызвать свою функцию с помощью конструктора таблицы:
myfunction{a,b=3,c=2}
(Это видно во многих местах Lua, например, в расширенных формах модулей протокола LuaSocket и конструкторов в IUPLua .)
Сама функция может иметь такую подпись:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
end
Любые значения, отсутствующие в таблице параметров, будут взяты из __index
таблицы в ее метатаблице (см. Документацию по метатаблицам ).
Конечно, с помощью конструкторов таблиц и функций можно использовать более сложные стили параметров - вы можете писать все, что вам нужно. Например здесь функция, которая создает функцию, которая берет таблицы с именованными или позиционными аргументами из таблицы, определяющей имена параметров и значения по умолчанию, и функцию, принимающую обычный список аргументов.
Поскольку такие вызовы не связаны с языком, они могут быть изменены для обеспечения нового поведения и семантики:
- Переменные могут принимать более одного имени
- Позиционные переменные и ключевые слова могут чередоваться - и определение обоих может дать приоритет любому из них (или вызвать ошибку)
- Можно использовать переменные без позиции только для ключевых слов, а также безымянные переменные только с позициями
- Довольно подробное построение таблицы может быть выполнено путем анализа строки
- Список аргументов можно использовать дословно, если функция вызывается не с одной таблицей.
Вот некоторые полезные функции для написания трансляторов аргументов unpack
(переход к версии table.unpack
5.2), setfenv
(не рекомендуется в версии 5.2 с новой _ENV
конструкцией) и select
(которая возвращает одно значение из заданного списка аргументов или длину списка с '#'
).