Справочное руководство по языку Lua 5.1 :: 2.5 - Получение длины
2.5 - Выражения
Выражениями в Lua являются следующие конструкции:
exp ::= prefixexp
exp ::= nil | false | true
exp ::= Number
exp ::= String
exp ::= function
exp ::= tableconstructor
exp ::= '...'
exp ::= exp binop exp
exp ::= unop exp
prefixexp ::= var | functioncall | '(' exp ')'
Числа и символьные строки рассмотрены в §2.1; переменные - в §2.3; описания функций - в §2.5.9; вызовы функций - в §2.5.8; конструкторы таблиц - в §2.5.7. Неявные аргументы, обозначаемые ‘...', могут использоваться только внутри соответственно заданной функции; смотрите §2.5.9.
К бинарным операциям (binop в формальном определении выражения) относятся арифметические (смотрите §2.5.1), операции сравнения (§2.5.2), булевские (§2.5.3) и операции конкатенации (смотерть §2.5.4). Унарными являются унарный минус (§2.5.1), отрицание not (§2.5.3) и операция получения длины # (§2.5.5).
Результат вызова функций и неявные параметры могут содержать несколько значений. Если при этом они используются в качестве оператора (§2.4.6) (только для функций), то все возвращеннаемые значения отбрасываются. Если это последний (или единственный) элемент в списке выражений, то никакая корректировка не проводится (если вызов не взят в скобки). В остальных случаях Lua приводит возвращаемый список к одному элементу, отбрасывая все значения кроме первого.
Далее несколько примеров:
f() -- результат функции отбрасывается
g(f(), x) -- берется первое значение из списка - результата вызова f()
g(x, f()) -- g получает x и все значения, полученные из f()
a,b,c = f(), x -- берется первый элемент результата вызова f()(и c получает nil)
a,b = ... -- a получает первый параметр из ..., b - второй (причем а и b могут получить nil, если в качестве неявных параметров ничего не передано)
a,b,c = x, f() -- 2 результата из f()
a,b,c = f() -- 3 результата из f()
return f() -- возвращает все значения из f()
return ... -- возвращает все полученные неявные аргументы
return x,y,f() -- вернет a, b и все, что вернет f()
{f()} -- создаст список со всем результатами вызова f()
{...} -- создаст список со всеми неявными параметрами
{f(), nil} -- 1 результат из f()
Выражение, заключенное в скобки всегда возвращает только одно значение. Таким образом, (f(x,y,z)) всегда даст единственное значение, даже если f возвращает несколько. (Значение (f(x,y,z)) это первое значение, полученное из f, или nil, если f не возвращает значений.)