[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Моддинг » 5.1. Уроки Lua » Урок 5. Таблицы. (Общее о таблицах. Работа с таблицами. Цикл for .. in)
Урок 5. Таблицы.
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
При написании программ часто требуется использовать не только стандартные данные, но и данные, организованные каким-либо образом.
Для этого придумали массивы(а в 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, ","))  --после изменения
Выведет:
Code
1,2,3,4
1,5,2,3,4

Функция table.maxn ищет в массиве максимальное положительное значение и возвращает его индекс. Если не найдет, то возвращает 0
Формат:

Code
table.maxn (table)

Фунция 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, ","))  --после изменения

Выведет:
Code
1,2,3,4
1,3,4

Функция 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])

Это не сложно, но почему-то у многих вызывает проблемы. Попробуйте хорошенько разобраться в этом сами.

Ну вот на этом закончим наш урок=)



[Прошлый урок]|[Список уроков]|[Следующий урок]


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Форум » Моддинг » 5.1. Уроки Lua » Урок 5. Таблицы. (Общее о таблицах. Работа с таблицами. Цикл for .. in)
  • Страница 1 из 1
  • 1
Поиск: