4.1 - Присваивание

Присваивание является основным средством изменения значения переменных или полей таблиц:

    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 - второе.
Hosted by uCoz