При написании программ часто требуется использовать не только стандартные данные, но и данные, организованные каким-либо образом.
Для этого придумали массивы(а в lua это зовётся таблицами).
Что такое таблица в луа? Это некоторый набор данных, в котором зная некоторый индекс можно узнать соответсвующее значение.
По сути таблица в луа состоит из двух столбцов. Первый - индекс, второй - значение. Чтобы создать таблицу используется конструктор таблиц.
Пример создания таблиц:
Code
a={} --пустая таблица
b={1,2,3,4,5} --таблица с числами
c={"ololo","ulyalyalya"} --таблица со строками
d={"ololo",777} --таблица со разными значениями
Как видно таблица создаётся простым перечислением её элементов в фигурных скобках через запятую.
Данные в таблице могут быть самые разные(любой из восьми типов).
При указанном выше способе индексы у значений будут нумероваться от 1 и по порядку.
Для обращения к элементу таблицы надо использовать квадратные скобки:
Code
c={"ololo","ulyalyalya"}
print(c[1]) --чтение из массива
print(c[2]) --до изменения
c[2]="zzzzzz" --запись в массив
print(c[2]) --после изменения
Кроме обычного перечисления можно задавать массив таким способом:
Code
a={[1]="zzz",[5]="ppp"}
print(a[1])
print(a[5])
При этом сразу задаются индексы. Поскольку индекс может быть любым типом, можно в качестве индекса задать строку:
Code
borya={["father"]="petya",["mother"]="marina"}
print(borya["father"])
print(borya["mother"])
Луа позволяет сократить эту запись:
Code
borya={father="petya",mother="marina"}
print(borya["father"])
print(borya["mother"])
То есть эти записи абсолютно эквиваленты(это работает только для текстовых индексов)
Кроме этого для доступа к текстовым индексам можно использовать такую запись:
Code
borya={father="petya",mother="marina"}
print(borya.father)
print(borya.mother)
Данный код очень близок ко многим так называемым объектно-ориентированным языкам, идея которых состоит в том, что данные представляются в форме описания объектов какого-либо класса объектов.
При этом у объектов имеются свойства и доступ к ним обычно произвоится через точку, как в примере выше. В нашем случае у объекта borya есть свойство father и mother.
Ну а можно создавать массивы просто создав пустую таблицу, а потом заполняя каждый элемент:
Code
c={}
c[1]=67
c["Vasya"]=22
c[23]={4,5,7,4}
Вы заметили, что элемент с индексом 23 - таблица? Всё верно, элементы могут быть любого типа-числом, строкой, таблицей, функцией и т.д.
Поэтому можно обратиться ко второму элементу таблицы, хранянящейся по индексу 23 в таблице c:
Code
c={}
c[1]=67
c["Vasya"]=22
c[23]={4,5,7,4}
print(c[23][2]) --выведет 5
Так, к примеру, можно создавать двумерные массивы(как таблички в экселе). Для примера переделаем пример из прошлого урока с таблицей умножения так, чтобы все числа хранились в двумерной таблице
Code
umn={} --тут будет таблица умножения
for i=1,9 do
umn[i]={} --добавляем строку(строка-это массив)
for j=1,9 do
umn[i][j]=i*j --в i-ую строку, j-ый столбец записываем произведение
end
end
--Дальше примерно такой же код как в прошлом уроке
stroka=" "
for j=1,9 do
stroka=stroka.." "..j
end
print(stroka)
for i=1,9 do
stroka=i
for j=1,9 do
if umn[i][j]<10 then
stroka=stroka.." "..umn[i][j]
else
stroka=stroka.." "..umn[i][j]
end
end
print(stroka)
end
Давайте рассмотрим всякие фишки массивов.
Чтобы узнать длину массива используется символ #. Пример:
Code
c={}
c[1]=42
c[2]=24
c[3]=63
print(#c) --выведет 3
Обратите внимание, что если в таблице встречается такой индекс, для которого значение = nil, то это считается концом массива.
Данный код выведет не 3, а 1:
Code
c={}
c[1]=42
c[2]=nil
c[3]=63
print(#c) --выведет 1
С помощью этого можно перебрать все элементы таблицы с числовыми индексами до первого элемента, не равного nil:
Code
c={3,53,6,467,7,4,3,4,56,7,8,8,4,2} --по умолчанию нумеруется по порядку от 1 до длины массива
for i=1,#c do
print(c[i])
end
В lua есть несколько стандартных функций, объединённых в модуль table(о модулях поговорим позже)
Чтобы сделать из таблицы текстовую строку, понятную человеку используют функцию table.concat, для этого указывается сама таблица, строка, которая будет разделять элементы таблицы, и если надо начальный и последний индекс выводимых значений
Вот формат функции(в квадратных скобках принято писать необязательные параметры):
Code
table.concat (table [, sep [, i [, j]]])
Пример использования:
Code
c={1,2,3,4}
print(table.concat (c, ",")) --выведет 1,2,3,4
print(table.concat (c, " < ")) --выведет 1 < 2 < 3 < 4
При этом подразумевается, что массив с числовыми индексами и не содержит "дыр", то есть нет пропусков индексов. Чтобы вставить в таблицу значение можно использовать функцию table.insert. Формат вызова:
Code
table.insert (table, [pos,] value)
Ей передаётся изменяемая таблица, место, кдуа встваить значение, само значение. При этом, если место не указано, то значение кладётся в конец массива.
Пример:
Code
c={1,2,3,4}
print(table.concat (c, ",")) --до изменения
table.insert (c, 2, 5) --вставляем число 5 во вторую позицию. Остальные элементы сдвигаются на 1 позицию вправо
print(table.concat (c, ",")) --после изменения
Выведет:
Функция table.maxn ищет в массиве максимальное положительное значение и возвращает его индекс. Если не найдет, то возвращает 0
Формат:
Фунция table.remove делает обратную функции insert процедуру-удаляет элемент из заданной позиции, сдвигая элементы обратно. Если не указан второй параметр, то удаляет последний элемент:
Формат:
Code
table.remove (table [, pos])
Пример:
Code
c={1,2,3,4}
print(table.concat (c, ",")) --до изменения
table.remove (c, 2) --Удаляем 2-ой элемент
print(table.concat (c, ",")) --после изменения
Выведет:
Функция table.sort сортирует таблицу по возрастанию или в заданном порядке.
Формат:
Code
table.sort (table [, comp])
Второй параметр задаёт порядок сортировки, но мы его рассматривать не будем.
Code
c={5,76,2,3,6,3,5,6}
print(table.concat (c, ",")) --до изменения
table.sort(c)
print(table.concat (c, ",")) --после изменения
Выведет:
Code
5,76,2,3,6,3,5,6
2,3,3,5,5,6,6,76
Теперь ещё одна прелесть lua - есть особый вид цикла для перебора всех элементов таблиц: for .. in .. do .. end
Обычно его используют так:
Code
c={}
c.x=30
c[90]=45
c["vasya"]="petya"
for key,value in pairs(c) do
print("c["..key.."] = "..value)
end
Выведет:
Code
c[vasya] = petya
c[x] = 30
c[90] = 45
Этот цикл пробегает по всем строчкам таблицы c и заносит в первую переменную key значение индекса, а во второе соответствующее значение(value=c[key])
Это не сложно, но почему-то у многих вызывает проблемы. Попробуйте хорошенько разобраться в этом сами.
Ну вот на этом закончим наш урок=)
[Прошлый урок]|[Список уроков]|[Следующий урок]