Программирование на Lua | ||
Часть I. Язык Гдава 4. Операторы |
Присваивание является основным средством изменения значения переменных или полей таблиц:
a = "hello" .. "world" t.n = t.n + 1
Lua позволяет множественное присваивание, когда список значений присваивается списку переменных за один шаг. В обоих списках элементы разделяются запятыми. Например, в результате присваивания
a, b = 10, 2*xпеременная
a
примет значение 10 и b
- значение 2*x
.
При множественном присваивании, Lua сначала вычисляет все значения и только потом выполняет присваивание. Следовательно, используя этот оператор можно поменять два значения, например
x, y = y, x -- обмен 'x' и 'y' a[i], a[j] = a[j], a[i] -- обмен 'a[i]' и 'a[j]'
Lua всегда подгоняет количество значений к числу переменных: когда значений меньше, чем переменных, "лишние" переменные устанавливаются в nil; когда список значений длиннее списка переменных, "лишние" значения отбрасываются:
a, b, c = 0, 1 print(a,b,c) --> 0 1 nil a, b = a+1, b+1, b+2 -- значение b+2 игнорируется print(a,b) --> 1 2 a, b, c = 0 print(a,b,c) --> 0 nil nilПоследнее присваиванее в приведенном выше примере иллюстрирует распространенную ошибку. Для инициализации набора переменных, обязательно указыать значения для каждой из них:
a, b, c = 0, 0, 0 print(a,b,c) --> 0 0 0
На самом деле, большинство приведенных примеров несколько надуманны. Я редко использую множественное присваивание просто для присваивания нескольких значений в одной строке. Но мнеожественное присваивание часто может быть действительно необходимым. Например, при обмене двух значений. Более часто рассматриваемый оператор используется для получения множественных результатов функций. Как можно увидеть позже, в более подробном разборе, функции могут возвращать множество значений. В таких случаях, единственное выражение сможет присвоить значения нескольким переменным. Например, в присваивании
a, b = f()
f()
возвращает два значения: a
получает первое, а b
- второе.
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. | Перевод на русский Artem13 |