Если вам нужны именованные аргументы и значения по умолчанию, такие как 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
(которая возвращает одно значение из заданного списка аргументов или длину списка с '#'
).
x or default
выражение также используется в этом ответе на самом деле не истинный эквивалент параметров по умолчанию , но только упрощенный обходной путь , который работает только если обаnil
иfalse
являются недопустимыми значениями параметров. Скажем, значение по умолчанию для логического параметраx
-true
и вызывающий передает явныйfalse
. Затемx or true
даетtrue
, даже еслиfalse
было явно пропущено. Лучшая версия была быif x == nil then x = default end
более читабельной; однако он по-прежнему не может обрабатывать явныеnil
аргументы.На мой взгляд, другого пути нет. Это просто менталитет Lua: никаких излишеств и, за исключением некоторого синтаксического сахара, никаких избыточных способов выполнения простых вещей.
источник
Технически, есть
b = b == nil and 7 or b
(что следует использовать в случае, когдаfalse
является допустимым значением, равнымfalse or 7
7), но, вероятно, это не то, что вы ищете.источник
false
, более простой способ - сначала поставить переменную, а последнюю - значение по умолчанию.b = b or 7
b = b or 7
).Единственный способ, который я нашел до сих пор, имеет смысл - это сделать что-то вроде этого:
function new(params) params = params or {} options = { name = "Object name" } for k,v in pairs(params) do options[k] = v end some_var = options.name end new({ name = "test" }) new()
источник