Таблицы. Что это такое и с чем его едят. Часть 1. — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Строка 54: | Строка 54: | ||
table.remove(t, 3) -- удаляет из таблицы элемент по индексу 3 и сдвигает оставшиеся элементы. t = {0, 1, 3, 4, 5, 6} | table.remove(t, 3) -- удаляет из таблицы элемент по индексу 3 и сдвигает оставшиеся элементы. t = {0, 1, 3, 4, 5, 6} | ||
− | ==Размер массива== | + | ===Размер массива=== |
Получение размера массива выполняется оператором #: | Получение размера массива выполняется оператором #: | ||
Версия 20:03, 1 апреля 2011
Таблицы.
Итак. Большинство модеров которые начинают осваивать скриптинг сталкера сталкиваются с таким понятием как таблицы.
Определение
Таблица - это ассоциативный массив (набор пар ключ-значение). Ключём (индексом) и значением может быть любой тип данных (за исключением nil).
Конструктор таблицы
Конструктор используется для создания таблиц и представляет собой список полей в фигурных скобках. Поля отделяются друг от друга запятыми (",") или точками с запятой (";"). При этом допускается наличие разделителя после последнего поля.
Таблица может быть проинициализирована при создании (стандартный конструктор таблицы) :
t1 = {} -- пустая таблица t2 = { 1, 5, 7, 'abc' } -- обычный массив t3 = { x = 7, y = "6" } -- таблица с именованными полями x и y t4 = { 1, 'string', x = 77 } -- смешанная таблица t5 = { 1, xxx = 17, } -- разделитель в конце допустим
Или заполнена позже, инициализируя каждую пару ключ-значение :
t4 = {} t4[1] = 1 -- Определяет число 1 на место, индексируемое номером 1 t4[2] = 'string' -- Определяет строку 'string' на место, индексируемое номером 2 t4['x'] = 77 -- Определяет число 77 на место, индексируемое строкой 'x'
Для удобства работы можно вместо индексирования таблицы по имени (строке) использовать это имя как имя поля структуры :
t4['x'] = 77 t4.x = 77
Эти две формы обращения полностью эквивалентны.
Массив
Чтобы получить обычный массив (таблица t2) просто задаются значения элементов. Ключи будут установлены автоматически. В Lua обычные массивы индексируются целыми, последовательно-нарастающими числами начиная с единицы. Примеры ниже эквивалентны.
t2 = { 1, 5, 7, 'abc' }
t2 = { [1]=1, [2]=5, [3]=7, [4]='abc' }
t2 = {} t2[1] = 1 t2[2] = 5 t2[3] = 7 t2[4] = 'abc'
Пока возможно, Lua внутри себя таблицу хранит как массив, а не как хэш - таблицу. В этом случае доступ к элементам таблицы происходит почти так же быстро, как в массивах Си. Поэтому без особой нужды не нужно превращать массив в хэш. Для того, чтобы не нарушать структуру при добавлении и удалении элементов массива стоит пользоваться библиотекой Lua table.
local t = {1, 2, 3, 4, 5} table.insert(t, 6) -- добавляет элемент в конец массива. t = {1, 2, 3, 4, 5, 6} table.insert(t, 0, 1) -- вставляет элемент по индексу, сдвигая оставшиеся элементы массива. t = {0, 1, 2, 3, 4, 5, 6} table.remove(t, 3) -- удаляет из таблицы элемент по индексу 3 и сдвигает оставшиеся элементы. t = {0, 1, 3, 4, 5, 6}
Размер массива
Получение размера массива выполняется оператором #:
local count = #t2
Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы:
t = {1, [100] = 2}
длина будет равна 1, поскольку t[1] не nil, а t[1 + 1] равно nil. Для обычного массива, оператор # вернет количество элементов в массиве.
to be continue ...
К примеру:
local variables = {1, 2}
Примечание: таблицы можно использовать как за функцией, так и внутри неё. В нашем случае таблица содержит набор чисел 1 и 2. Что же с ними можно сделать?
function table() local variables= {1, 2} --наша таблица rezultat = variables[math.random(table.getn(variables))] --rezultat локальная переменная. if rezultat == 1 then news_manager.send_tip(db.actor,lose_text, nil, nil, 10000) and db.actor:give_info_portion("lose") end if rezultat == 2 then news_manager.send_tip(db.actor,win_text, nil, nil, 10000) and db.actor:give_info_portion("win") end end
Поясню: variables[math.random(table.getn(variables))] этот оператор позволяет взять рандомное значение из данной таблицы. Тобишь случайно взять либо число 1, либо число 2.
if rezultat == 1 then news_manager.send_tip(db.actor,lose_text, nil, nil, 10000) and db.actor:give_info_portion("lose") end if rezultat == 2 then news_manager.send_tip(db.actor,win_text, nil, nil, 10000) and db.actor:give_info_portion("win") end
Определяет значение взятое из таблицы, и в зависимости от результата присылает нам то или иное сообщение (news_manager.send_tip(db.actor,***, nil, nil, 10000)) и даёт тот или иной инфопоршень (db.actor:give_info_portion("***") end).
==
Это оператор сравнения. В нашем случае это "равно". Так же есть операторы:
> - больше.
< - меньше.
>= - больше или равно.
<= - меньше или равно.
~= - не равно.
Сравнивать можно только числа или локальные переменные с присвоенными к ним числами.
На этом примере вы можете создать простейшую функцию спауна:
local stalker_types = {"bread", "kolbasa", "conserva", "vodka"}
function spawn_item() alife():create(stalker_types[math.random(4)],vector():set(-0.112,0.477,-215.563),174943,265) end
Как видите таблица используется вне функции, но можно и в самой функции. В данном примере в определённой точке с координатами (-0.112,0.477,-215.563),174943,265) заспаунится определённый предмет из списка. В эту таблицу можно внести как сталкеров, так и мутантов.
Позже продолжу. iDreD aka кровоSTALKER.