Как стать автором
Обновить

Lua Tables

Предисловие: это совсем не столы, а тэйблы. Данная статья будет полезна скриптерам известной игры MTA:SA.

Матрица
Матрица

В конце статьи вы поймёте к чему картинка из фильма «Матрица». Ну а сейчас вернёмся ко всем известному понятию Lua скриптеров — Tables.

Для тех кто не знает, что такое Tables. Table (или как правильнее называть массив) — структура данных, хранящая набор значений (элементов массива), идентифицируемых по индексу или набору индексов.

Известно, что в Lua нет примитивных типов. Все знакомы лишь со String, Boolean, nil и Number. Именно эти типы могут содержать массивы. Да, можно меня исправить и сказать: «Как же ты забыл тот случай, когда мы в таблицу ложим ElementData?». Конечно, и ElementData мы можем помещать в массив, но сама ElementData — это и есть один из приведенных мною типов.

Как же работать с массивами?

Начнём разбирать код.

Пример 1. Создание пустого массива и его заполнение.

luaTable = {} -- simple table empty 
luaTable[1]= "LUA VALUE" --simple table value assignment 

Всё просто. Дополню, что нумерация элементов массива — с единицы, а не с нуля как многие привыкли!
Теперь сложнее — встроенные Lua функции для массивов.

Пример 2. table.concat — объединение элементов массива.

local luaValue = {"1","2","3","4","5","6"} -- просто
outputChatBox(table.concat(luaValue))
-- output : 123456 

local luaValue = {"1","2","3","4","5","6"} -- объединение с использованием разделителя
outputChatBox(table.concat(luaValue,", "))
-- output : 1,2,3,4,5,6 

local luaValue = {"1","2","3","4","5","6"} -- объединение на основе индексов
outputChatBox(table.concat(luaValue,", ", 2,3))
-- output : 2,3

Пример 3. table.insert — вставляет значение в массив по указанной позиции.

local luaValue = {"Yellow","Blue","Red"}
table.insert(luaValue,"Green") -- вставляет «Green» четвёртым элементом в массив
-- результат : luaValue = {"Yellow","Blue","Red","Green"}
outputChatBox("Last color added "..luaValue[4]) -- Green 

table.insert(luaValue,2,"Black") -- вставляет вторым элементом значение «Black», «Blue» — уже третий элемент, а не второй
outputChatBox("Color at index 2 is "..luaValue[2]) -- Black 

Пример 4. table.remove — удаление элемента из массива.

table.remove(luaValue) -- удалили «Green» из прошлого примера
outputChatBox("The previous last element is "..luaValue[5]) -- nil

Что же вернёт luaValue[6], luaValue[7], …, luaValueL[1000] и так далее? Если массив не имеет значений по заданному индексу — он вернёт nil.

Пример 5. table.sort — сортировка элементов массива с использованием компаратора.

local luaValue = {"Yellow","Blue","Red","Green"} -- здесь понятно
table.sort(luaValue)

for k,v in ipairs(luaValue) do -- выводим циклом
  outputChatBox("Index: "..k..", Value:"..v)
end 

--[[ Result 
Index: 1, Value: Blue 
Index: 2, Value: Green 
Index: 3, Value: Red 
Index: 4, Value: Yellow ]]--

Видим, что элементы отсортированы в алфавитном порядке.

Второй вид сортировки — с использованием функции (того самого компоратора).

local widgets = {
  { id = 246, num1 = 90885, val2 = "NA" },
  { id = 250, num1 = 95689, val2 = "NA" },
  { id = 257, num1 = 95694, val2 = "NA" } -- не забываем убирать запятую в конце! Будьте аккуратны в написании своего кода
}

-- сортируем по значению num1

table.sort(widgets, function(a,b) return a.num1 < b.num1 end)

for i, widget in ipairs(widgets) do
  outputChatBox(widget.num1)
end

Обратите внимание на этот массив. Какой он? Ответ в конце статьи.

Пример 6. table.maxn — возвращает наибольший индекс в массиве. Данная функция устарела. Не путаем её с #table — длиной массива. Из прошлого примера:

local length = #widgets
outputChatBox(length) -- 2

Пример 7. unpack — распаковывает массив (возвращает все его элементы).

Данная функция эквивалентна:

return list[i], list[i+1], ···, list[j]

То есть она сокращает запись, если аргументы (к примеру у функции) находятся в массиве:

local coords = {123, 321, 231}
setElementPosition(element, unpack(coords))

-- то же самое, что
setElementPosition(element, coords[1], coords[2], coords[3])

Вывод

Как оказалось, массивы — вовсе не сложная штука. Теперь про картинку из начала статьи. В примере 5 я попросил вас обратить внимание на массив. Он многомерный (в данном случае двойной). То есть мы имеем дело с массивами, которые в массиве.

Таблица
Таблица

Что же у нас получилось? А получилась у нас как раз таблица 3х3, или как ещё можно назвать — матрица.

Всем спасибо! Надеюсь, вам было интересно!

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.