|
Программирование на 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 |
|