Pull to refresh

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, или как ещё можно назвать — матрица.

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.