Lua Closures в реализации DSL
-
07-07-2019 - |
Вопрос
У Lua действительно хороший синтаксис вызова без скобок, который в сочетании с замыканиями функций позволяет мне написать следующее
local tag = 1
function test(obj)
return
function(str)
return
function (tbl)
tbl.objtag = tag
tbl.objname = str
return tbl
end
end
end
test (tag) "def"
{
}
test tag "def" --error
{
}
Однако, если я уберу круглые скобки (тег), это приведет к ошибке компиляции. Так почему же Lua допускает параметры без скобок (то есть «def»), а не параметры без скобок (таблица в данном случае)?
Решение
Если функция имеет один единственный аргумент и этот аргумент является либо литеральной строкой, либо конструктором таблицы, то скобки являются необязательными:
Мое понимание вашей ситуации, приведенной выше, заключается в том, что тег является локальной переменной (которая не является ни литеральной строкой, ни конструктором таблицы), поэтому для test (tag)
всегда требуются скобки. Вам не нужны круглые скобки вокруг " def "
, потому что test (tag)
возвращает функцию, которая принимает одну строку, и эта функция немедленно применяется к " def "
.