2.4.3 – Присваивание
Lua поддерживает параллельное присваивание. В общем случае, оператор
присваивания выглядит как список переменных, символ ‘=’ и список выражений.
Элементы списков указываются через запятую:
stat ::= varlist1 '=' explist1
varlist1 ::= var {',' var}
explist1 ::= exp {',' exp}
Выражения (exp)
рассмотрены в §2.5.
Перед выполнением присваивания список переменных согласовывается по длине со
списком выражений. Если список справа длиннее, то его лишние элементы просто отбрасываются. Если короче, то недостающие
позиции дополняются значениями nil. Если список операторов оканчивается вызовом функции, то
перед согласованием все возвращаемые оттуда значения вставляются в правый списк
(за исключением случаев, когда вызов взят в скобки; смотрите §2.5).
Перед выполнением присваивания вычисляется значение всех выражений. Код
i = 3
i, a[i] = i+1, 20
означает, что переменной a[3] присваивается значение 20, потому что i в
выражении a[i] имеет то же самое значение, что и в
момент вычисления выражения i+1.
Аналогично, строка
x, y = y, x
является простым способом обмена значениями двух переменных.(при
«традиционном» способе требуется дополнительная переменная)
Действие операции присваивания для глобальных переменных и полей таблиц может
быть переопределено посредством метатаблиц. Присваивание индексной переменной t[i] = val эквивалентно вызову settable_event(t,i,val). (Полное описание функции settable_event смотрите в
§2.8. Эта функция недоступна в коде Lua, мы упоминули ее здесь в качестве
примера.)
Присваивание к глобальной переменной x=val эквивалентно присваиванию _env.x=val, то же самое
произойдет при вызове
settable_event(_env, "x", val)
где _env окружение запущенной функции. (Переменная _env недоступна в Lua,
мы приводим ее здесь в качестве примера. )
|