Справочное руководство по языку 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 не возвращает значений.)