Может кто провести краткий ликбез - как работать с таблицами?
Могу.
Так выглядит конструктор таблицы.
local foo = {}
В конструкторе можно указывать значение. По умолчанию они получат числовые индексы по порядку начиная с единицы.
local foo = {'a', 'b', 'c'}-- foo[1] == 'a'-- foo[2] == 'b'-- foo[3] == 'c'
Ключи можно указать явно. В этом случае они могут быть не обязательно числовыми, целыми, или положительными.
local foo = {[-1]='a', [0]='b', ['1bar1']='c'}
Если ключ является строкой, выполняющий требование к именам идентификаторов (состоит только из букв, цифр, символа подчеркивания, первый символ не цифра, и строка не совпадает с ключевыми словами lua), то скобки и кавычки можно опустить.
local foo = {bar=1, _=2, bar2=3}
Вместо запятых можно использовать точку с запятой. Также мы можем оставить один разделитель после последнего элемента.
local foo = {bar=1; _=2; bar2=3;}
В таблицу в любой момент можно добавить новый элемент. Если элемент с таким ключем уже существует, он будет заменен. Получить доступ к элементу можно этим же путем.
local foo = {}foo['some key'] = 5local value = foo['some key']
Если ключ является строкой, выполняющий требование к именам идентификаторов, то скобки и кавычки можно опустить.
local foo = {}foo[paste][/paste]key = 5
Ключем и значением элемента таблицы может быть любое число, строка, булеан, функция, таблица, или даже корутин и юзердата. Таблица может включать даже саму себя.
local foo = {}foo[foo] = foofoo[true] = function() end
Присвоение элементу nil означает его удаление. Элементы при этом не сдвигаются.
local foo = {1, 2, 3}foo[2] = nil
Таблица может иметь "дыры" в индексах.
local foo = {1, nil, 3} -- тут только 2 элемента
Получить число непрерывной серии элементов с целыми числовыми ключами, начинающимися с единицы можно так.
local foo = {[0] = 0, 1, 2, 3, 4[paste][/paste]1 = 4[paste][/paste]1, [5] = 5, bar = 'bar'}print(#foo) -- 3
Обойти все элементы (с любыми ключами) можно так. Порядок обхода элементов при этом не определен.
local foo = {a=1, b=2, c=3}for k,v in pairs(foo) do print(k,'=',v)end
По быстрому добавить элемент в конец таблицы можно так.
local foo = {1, 2, 3}foo[#foo + 1] = 4
Удалить элемент из таблицы со двигом можно так. Второй аргумент - индекс удаляемого элемента.
local foo = {1, 2, 3}table[paste][/paste]remove(foo, 2)
Таблицы передаются в функции по ссылке. Это значит что изменив таблицу внутри функции она изменится и снаружи. То же самое касается и присваивания таблиц.
local foo = {1, 2, 3}local bar = foobar[3] = nilprint(foo[3]) -- nil
Контруктор таблиц можно использовать на месте, не создавая переменных.
function print_size(t) print(#t) endprint_size ({1, 2, 3}) -- 3