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

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 6, среднее: 5,00 из 5)
Загрузка...

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;

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

Добавить комментарий

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

  1. Не понял, как я могу сделать в виде счетчика переменную, и возможно ли это.
    local count = 0
    local pp = 1
    if pp == 1 and count >= 1 then
    print(pp)
    else
    count = count + 1
    print(count)
    end
    не получается сделать что бы count каждый раз увеличивался на 1, допустим вот стал он 1, но что бы в другой раз когда обращались к этой переменной она была уже 2 и прибавляло к себе 1. можно ли как то это реализовать?

  2. Не нашел, как сделать преждевременный выход из функции. Если после какой-либо проверки исчезает смысл дальнейшего выполнения функции, что-то вроде

    1
    
    if t[0]==nil then exit

    Как это реализовано в LUA? Спасибо.

  3. Приветствую.
    Дмитрий,никак не могу разобраться,как мне отсортировать таблицу,в которой несколько колонок и строк.Например,по первой колонке или по третьей.
    table.sort() работает для таблицы с одной колонкой,а как отсортировать с несколькими?Пробовал через рекурсию функции,которая высчитывает максимумы первой колонки и т.д., но не получилось. Не вдуплю как в целом код должен выглядеть.
    Таблица,например, такого вида:
    arr = {}
    table.insert(arr , {3,1,2})
    table.insert(arr , {4,2,3})
    table.insert(arr , {2,0,5})
    table.insert(arr , {6,5,6})
    table.insert(arr , {10,11,8})

    1. Здравствуйте! Не помню как правильно, но сочинил вот такую функцию (с примером использования):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      
      function main()
         arr = {}
         table.insert(arr , {3,1,2})
         table.insert(arr , {4,2,3})
         table.insert(arr , {2,0,5})
         table.insert(arr , {6,5,6})
         table.insert(arr , {10,11,8})
       
         for i = 1,#arr do message(arr[i][1]..' '..arr[i][2]..' '..arr[i][3]) end
         message(' ')
       
         ArraySortByColl(arr, 3)
       
         for i = 1,#arr do message(arr[i][1]..' '..arr[i][2]..' '..arr[i][3]) end
         message(' ')
      end
       
      -- Сортирует переданный массив (arr) по столбцу (col_number)
      ArraySortByColl = function(array, col_number)
         for j = 1, #array - 1 do
            for i = 2, #array do
               if array[i][col_number] < array[i-1][col_number] then
                  local x = array[i-1][col_number]
                  array[i-1][col_number] = array[i][col_number]
                  array[i][col_number] = x
               end
            end
         end
      end
      1. В Вашем примере,если в функцию передать сортировку по 1 колонке,то она сортирует только первую колонку, а остальные колонки остаются в изначальном порядке.
        2 1 2
        3 2 3
        4 0 5
        6 5 6
        10 11 8
        А как сделать,чтобы строки соответствовали друг другу,как они были изначально,но уже в отсортированном виде,вот так:
        2 0 5
        3 1 2
        4 2 3
        6 5 6
        10 11 8

        1. Ой, да, что-то я затупил немного, видимо из-за того, что у нас уже 2 часа ночи 🙂

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          
          function main()
             arr = {}
             table.insert(arr , {3,1,2})
             table.insert(arr , {4,2,3})
             table.insert(arr , {2,0,5})
             table.insert(arr , {6,5,6})
             table.insert(arr , {10,11,8})
           
             for i = 1,#arr do message(arr[i][1]..' '..arr[i][2]..' '..arr[i][3]) end
             message(' ')
           
             ArraySortByColl(arr, 1)
           
             for i = 1,#arr do message(arr[i][1]..' '..arr[i][2]..' '..arr[i][3]) end
             message(' ')
          end
           
          -- Сортирует переданный массив (arr) по столбцу (col_number)
          ArraySortByColl = function(array, col_number)
             for j = 1, #array - 1 do
                for i = 2, #array do
                   if array[i][col_number] < array[i-1][col_number] then
                      local x = array[i-1]
                      array[i-1] = array[i]
                      array[i] = x
                   end
                end
             end
          end
  4. Здравствуйте! Пожскажите, пожалуйста, чего этот изверг от меня хочет (ниже фрагмент кода и сообщение об ошибке)

    1
    2
    3
    
    28		for i=DSf:Size()-100, i&lt;=DSf:Size(), 1 do
    29			QuoteStr=QuoteStr..tostring(DSf:T(i))..tostring(DSf:С(i))..&quot;\n&quot;;
    30		end

    Syntax error while compiling C:\Users\...\Proverka.lua:29: '' expected near 'Р'

  5. Дмитрий, такой вопрос по массивам - можно ли жестко задать его размер, например 1*10?
    Я хочу реализовать фифо длиной 10. Как мне случайно не раздуть его размер?
    Сейчас я это представляю только, как перед sinsert проверять размер фифо, если он >=10, то вначале делаем sremove затем sinsert, иначе сразу sinsert
    Это корректное решение?

  6. Дмитрий, добрый день!
    Подскажите, пожалуйста, метод или какую-нибудь функцию позволяющую записать одномерный или двумерный массив в файл. Желательно без прибегания к циклам.
    Спасибо

  7. Здравствуйте
    Я начал писать индикатор для кивка,не не совсем понятно где в QLUA можно объявить массивы.Можете написать какой-нибудь пример?