English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Переменные Lua

Перед использованием переменной, её необходимо声明 в коде, то есть создать переменную.

Перед выполнением кода компилятор должен знать, как резервировать пространство для переменных в памяти, чтобы хранить значения переменных.

Переменные в Lua имеют три типа: глобальные переменные, локальные переменные, поля таблицы.

В Lua все переменные являются глобальными, даже в блоке или функции, если не объявлены явно как локальные переменные.

Область действия локальных переменных начинается от места их объявления до конца блока.

Значение по умолчанию для всех переменных nil.

-- скрипт файла test.lua
a = 5 -- глобальная переменная
local b = 5 -- локальная переменная
function joke()
    c = 5 -- глобальная переменная
    local d = 6 -- локальная переменная
end
joke()
print(c, d) --> 5 nil
do 
    local a = 6 -- локальная переменная
    b = 6 -- повторное присваивание локальной переменной
    print(a, b); --> 6 6
end
print(a, b) --> 5 6

Результат выполнения примера выше:

$ lua test.lua 
5 nil
6 6
5 6

Оператор присваивания

Присваивание - это最基本的 способ изменить значение переменной и значение поля таблицы.

a = "hello" .. "world"
t.n = t.n + 1

Lua может присваивать нескольким переменным одновременно, элементы списка переменных и списка значений разделены запятыми, значения справа присваиваются слева по порядку.

a, b = 10, 2*x --> a=10; b=2*x

Lua сначала вычисляет все значения справа в операторе присваивания, а затем выполняет оператор присваивания, поэтому мы можем так обменивать значения переменных:

x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'

Когда количество переменных и количество значений не совпадает, Lua продолжает использовать следующий стратегию на основе количества переменных:

a. Количество переменных > количество значений - дополняется nil по количеству переменных
Количество переменных b < количество значений             Избыточные значения будут игнорироваться
a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
 
a, b = a+1, b+1, b+2     --  Worth of b+2 is ignored
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.

Следует использовать локальные переменные по возможности, это имеет два преимущества:

  • 1. Избегайте命名ных конфликтов.

  • 2. Скорость доступа к локальным переменным быстрее, чем к глобальным.

Индекс

Индексирование таблицы производится с помощью фигурных скобок []. Lua также предоставляет оператор .

t[i]
t.i                 -- Упрощенная запись при индексе в виде строки
gettable_event(t,i) -- Поступление индекса подобно такому вызову функции
> site = {}
> site["key"] = "ru.oldtoolbag.com"
> print(site["key"])
ru.oldtoolbag.com
> print(site.key)
ru.oldtoolbag.com