Переменные в Lua
Перед использованием переменной её необходимо объявить в коде, то есть переменная должна быть создана.
Перед выполнением кода компилятору нужно знать, как выделить память для переменных инструкций, чтобы хранить их значения.
В Lua есть три типа переменных: глобальные переменные, локальные переменные и поля в таблицах.
Все переменные в Lua являются глобальными переменными, даже в блоках инструкций или функциях, если только они явно не объявлены как локальные переменные с помощью `local`.
Область видимости локальной переменной — от позиции её объявления до конца блока инструкций, в котором она находится.
Значением переменных по умолчанию является nil.
Пример
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 + 1Lua может присваивать значения нескольким переменным одновременно. Элементы списка переменных и списка значений разделяются запятыми. Значения в правой части оператора присваивания присваиваются переменным слева по порядку.
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. 变量个数 < 值的个数 多余的值会被忽略
Пример
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.
Следует как можно чаще использовать локальные переменные. Это даёт два преимущества:
- 1. Избегать конфликтов имён.
- 2. Доступ к локальным переменным быстрее, чем к глобальным.
Индексирование
Используйте квадратные скобки [] для индексирования таблиц. Lua также предоставляет операцию .
t[i] t.i -- 当索引为字符串类型时的一种简化写法 gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
Пример
> site["key"] = "www.example.com"
> print(site["key"])
www.example.com
> print(site.key)
www.example.com