Переменные, массивы и функции в QLua (lua)

Автор записи: Дмитрий (Admin)

Qlua-основыВ Qlua есть следующие типы переменных:

   nil (неопределенный),
   boolean (логический),
   number (числовой),
   string (строковый),
   function (функция в Lua является типом данных),

а также, есть массивы (таблицы Lua), в т.ч. многомерные, которые могут содержать в себе все вышеперечисленные типы данных.

Для того, чтобы объявить переменную в Qlua, достаточно присвоить ей значение. Язык Qlua сам определит к какому типу отнести переменную.

Примеры:

A = true; -- Теперь переменная A имеет логический тип boolean
   -- в QLua(Lua) все значения являются TRUE, кроме nil и FALSE
 
B = 1;
C = 1.5;
-- Переменные B и C имеют числовой тип number, который может содержать как целые числа, так и числа с дробной частью
 
D = "Текст"; -- Переменная D имеет строковый тип string
 
E = {}; -- Переменная E теперь является массивом нулевой длинны
-- Массив в QLua может хранить внутри себя значения РАЗНЫХ! типов одновременно
-- Так присваиваются значения элементам:
E[1] = 10; -- ВАЖНО !!! Элементы массива в QLua, по умолчанию, индексируются, начиная с 1, а не с 0,
   -- хотя ключами(индексами) могут быть и отрицательные числа и слова и строки
   -- пример инициализации:
   F = {green = "Зеленый", [-10] = 30};
   -- НЮАНС!!!
   G = {good year = 2015}; -- такая инициализация вызовет ошибку
   G["good year"] = 2015;  -- а так ошибки не будет
   -- примеры добавления:
   F["apple"] = "Яблоко";
   F[-20] = 12345;
   E[2] = "Текст";
 
-- МНОГОМЕРНЫЕ массивы создаются так же, как и одномерные, мерность зависит от количества вложенных фигурных скобок:
A = {{{}}}; -- объявлен трехмерный массив
A[1][1][1] = "Значение"; -- пример обращения к массиву
 
-- Массивы в QLua являются таблицами, по-этому к ним можно применять функции из таблицы table языка lua:
table.concat(Array, str, i, j) -- Выполняет конкатенацию элементов массива в одну строку и возвращает ее
   -- Array - это исходный массив,
   -- str (необязательный параметр) - строка, вставляемая между элементами
   -- i (необязательный параметр) - начальный индекс (по умолчанию, 1)
   -- j (необязательный параметр) - конечный индекс (по умолчанию, индекс последнего элемента массива)
table.insert(Array, i, new_element) -- Вставляет элемент new_element в массив Array по индексу i, сдвигая существующие элементы
   -- i (необязательный параметр) - по умолчанию, новый элемент добавляется в конец массива, увеличивая его на 1 элемент
table.maxn(Array); -- Возвращает максимальный положительный числовой индекс, если таковых нет, возвращает 0
table.remove(Array, i); -- Удаляет элемент таблицы по индексу i
   -- i (необязательный параметр) - по умолчанию, удаляется последний элемент массива
table.sort(Array, func); -- Сортирует элементы массива, размещая их по определенному правилу
   -- func (необязательный параметр) - по умолчанию, функция сортирует элементы по возрастанию, применяя сравнение "<",
     -- но можно применить свой порядок, для этого, вторым параметром нужно передать функцию, принимающую 2 параметра,
     -- которая будет возвращать true, если параметр 1 меньше параметра 2.
     -- Пример:
     Arr = {2,4,3,1,5};
     function MySort(a,b)
        if a > b then
           return true;
        else
           return false;
        end;
     end;
     table.sort(Arr);         -- В результате в массиве Arr будет такой порядок {1,2,3,4,5}
     table.sort(Arr, MySort); -- В результате в массиве Arr будет такой порядок {5,4,3,2,1}
 
-- Чтобы узнать количество элементов в массиве, применяется оператор "#"
-- в предыдущем примере #Arr вернет 5, но есть один ВАЖНЫЙ МОМЕНТ!!!:
Arr[2] = nil; -- теперь в массиве содержатся значения {5,3,2,1}, а индексы (1,3,4,5), т.е. индекс 2 отсутствует,
-- сейчас #Arr вернет 1, т.к. элемент по индексу 2 не существует

Все переменные, объявленные выше, являются ГЛОБАЛЬНЫМИ по типу видимости, т.е., объявив так переменную в одной функции, можно будет использовать ее значение в любой другой функции, находящейся в том же скрипте. Можно объявить переменную ЛОКАЛЬНОГО типа, использовать которую можно будет только внутри той функции, в которой Вы ее создали. Для этого перед именем переменной нужно поставить идентификатор local.

Примеры:

A = 1; -- ГЛОБАЛЬНАЯ, видна везде в скрипте
local B = 2; -- ЛОКАЛЬНАЯ, но, так как объявлена в основном теле скрипта, а не внутри функции, видна везде в скрипте
 
function F1()
   -- Здесь видны переменные A и B, можно как брать из них значения, так и изменять их
 
   C = 3; -- Объявлена ГЛОБАЛЬНАЯ переменная
   local D = 4; -- Объявлена ЛОКАЛЬНАЯ переменная
   local A = 5; -- Объявлена НОВАЯ ЛОКАЛЬНАЯ переменная, которая не изменила значение ранее объявленной переменной A
end;
 
function F2()
   -- Здесь видны переменные A(первая), B и C, можно как брать из них значения, так и изменять их
   -- Если обратиться здесь к переменной A, то увидим, что она, по-прежнему, равна 1
   -- Переменная D здесь не видна
end;

Функции

-- Объявление:
function Name(параметр1, параметр2,...)
end;
-- следующая запись эквивалентна:
Name = function(параметр1, параметр2,...)
end;
   -- Функция в QLua(Lua) может иметь входные параметры, а может и не иметь
   -- Параметры, это локальные для данной функции переменные, значения которых передаются при вызове функции
-- Функция в QLua(Lua) может иметь переменное число параметров
-- пример 1:
function F1(a,b,...)
end;
   -- Пример вызова:
   F1(1,2,3,4);
   -- Значение 1 присвоится переменной a
   -- Значение 2 присвоится переменной b
   -- Для оставшихся значений (3 и 4), существует встроенная переменная arg, у которой есть поле n,
      -- в которую заносится количество переданных дополнительных значений, в данном случае arg.n равно 2
   -- Значение 3 присвоится переменной arg[1]
   -- Значение 4 присвоится переменной arg[2]
 
-- пример 2:
function F2(...)
end;
   -- Пример вызова:
   F2(1,2,3);
   -- Значение 1 присвоится переменной arg[1]
   -- Значение 2 присвоится переменной arg[2]
   -- Значение 3 присвоится переменной arg[3]
   -- arg.n равно 3
 
-- Функции в QLua(Lua) могут не возвращать, или возвращать одно и более значений,
   -- для этого служит оператор return
-- Пример:
function F()
   return 1,2,3;
end;
-- Вызов 1:
A = F();
-- A[1] получит значение 1
-- A[2] получит значение 2
-- A[3] получит значение 3
-- Вызов 2:
A,B,C = F();
-- A получит значение 1
-- B получит значение 2
-- C получит значение 3
-- Вызов 3:
_,_,A = F();
-- A получит значение 3
-- Символ "_" служит в QLua(Lua) для замены ненужных переменных

QLua поддерживает параллельное присваивание:

   -- Запись
   a,b,c = 1,2,3;
   -- эквивалентна записи
   a = 1;
   b = 2;
   c = 3;

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!