Lua

Lua — это скриптовый язык программирования, применяемый при создании игр. Читается как «лу́а» с ударением на у, в переводе с португальского означает «луна».

На Lua написан графический интерфейс Adobe LIghtroom, делаются уровни в World of Warcraft, написаны некоторые игры вроде Grim Fandango. Популярность этих игр определила и популярность Lua.

Существует несколько версий и реализаций Lua, мы будем рассматривать этот язык в привязке с Corona SDK, где Lua используется для разработки мобильных приложений под iOS и Android.

Распространяется по лицензии Creative Commons «Attribution-NonCommercial» («Атрибуция — Некоммерческое использование») 4.0 Всемирная.

Взято с сайта webref.ru


Комментарии в Lua

Комментарии в любом языке программирования применяются для пояснения работы переменных, функций, циклов и других фрагментов кода. Это полезно как самому разработчику, чтобы не забыть, как и что он сделал, так и другим разработчикам, чтобы быстро вникнуть в работу программы. Комментарии также помогают упорядочить мысли и тем самым упростить написание программы. В общем, комментировать нужно чаще и больше.

Комментарии в Lua бывают двух типов: однострочные и многострочные. Однострочные комментарии начинаются с двух минусов и всё, что идёт после них компилятор игнорирует.

-- Простой комментарий

-- Немного другой комментарий
-----------------------------------------------

abc = 5; -- переменной abc присвоено значение 5

Допустимо использовать вложенные комментарии, они воспринимаются компилятором как один.

abc = 5; -- переменной abc присвоено значение --5--

Главное не ставить символы -- перед исполняемым кодом. Нужно помнить, что комментарий это всё, что сразу же следует за двумя минусами.

Многострочный комментарий полезно применять, когда надо написать много поясняющего текста или временно исключить из обработки целые фрагменты кода. Пишется подобный комментарий так:

--[[
  Это двух-
  и более строчный комментарий
--]]

Опять же, внутри одного комментария вполне можно вставлять другой.

--[[
  -- Ещё комментарий
--]]


Переменные в Lua

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

Имена переменных

В имени переменных допустимо использовать только латинские буквы и символ подчёркивания (_var). Переменные обязательно должны начинаться с латинской буквы или символа подчёркивания и не должны начинаться с цифры.

Правильные переменные
_lyric
dust
o_O
terminator2

Неправильные переменные
123 -- начинается с цифры
креветка -- содержит русские буквы
to-to -- содержит знак -

Типы переменных

В Lua есть несколько типов переменных: nil, логический, число, текст, функция, таблица.

nil
nil — это пустое значение. Любая переменная, которая ещё не получила значение имеет nil.

apple = 5; res = apple + b;

В данном примере будет выведена ошибка, поскольку переменная b явно не определена и по умолчанию равна nil, что и приводит к ошибке при сложении.

Логический
К логическому (булевому) типу относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным.

if (a > 1) then
  return true
end

В данном примере будет возвращена истина, если переменная a больше единицы.

Числа
Все числа в Lua являются вещественными (двойной точности с плавающей запятой, если вдаваться в подробности). Впрочем, если вы складываете два целых числа, то и результат увидите в виде целого числа.

res = 10 + 14;
print (res);

В данном случае будет выведено число 24.

Текст
Для обозначения текста применяются двойные или одинарные кавычки, а также их комбинация. Разницы между двойными и одинарными кавычками в большинстве случаев нет, за исключением случая, когда внутри текста встречается кавычка.

song1 = 'Bohemian Rhapsody';
song2 = "We Will Rock You";
song3 = "Don't Try So Hard";
song4 = 'You\'re My Best Friend';
song5 = 'Teo Torriatte ("Let Us Cling Together")';

В данном примере в первых двух переменных применяются разные кавычки и это никак не отражается на их значении. В тексте третьей строки встречается одинарная кавычка, поэтому, чтобы исключить конфликт кавычек, весь текст взят в двойные кавычки. В четвёртой строке текст взят в одинарные кавычки, а внутренний апостроф экранирован с помощью слэша (\'). В пятой строке весь текст взят в одинарные кавычки, поскольку внутри текста встречаются двойные кавычки.

Многострочный текст можно сделать двумя способами.

1. Использовать двойные кавычки, как показано выше и в месте перевода строки вставить \n.

text = "Это\nмногострочный\nтекст;

2. Обозначить многострочный текст двойными квадратными скобками, как показано ниже.

text = [[ Это
многострочный
текст ]]

Функция
Функции применяются для вызова фрагмента кода. Функции могут возвращать одно или несколько значений в зависимости от заданных параметров или вообще без них. В примере ниже функция возвращает ряд чисел в переменную lost.

lost = numbers();
function numbers()
  return 4, 8, 15, 16, 23, 42;
end

Таблица
Таблица представляет собой ассоциированный массив с широкими возможностями. В качестве индекса могут применяться не только числа, но и текст, за исключением nil. Ниже в примере показано, как определить таблицу и её значения.

t = {} -- определяем таблицу
t["foo"] = 123 -- значение 123 связано с ключом "foo" в таблице t
t[3] = "bar" -- значение "bar" связано с ключом 3 в таблице t

Ключевые слова

В качестве переменных нельзя использовать следующие зарезервированные ключевые слова:

and break do else elseif end false for function if in local nil not or repeat return then true until while

Глобальные и локальные переменные

Все переменные по умолчанию считаются глобальными, они доступны в любом месте кода. Если требуется локальная переменная, например, только внутри функции, то перед именем переменной добавляется ключевое слово local.

a = 1; -- глобальная переменная
local b = 2; -- локальная переменная


Условные операторы

Условные операторы обеспечивают выполнение определённого набора команд при осуществлении одного или нескольких логических условий. Обычно применяются для проверки переменных. Синтаксис следующий:

if <условие> then
  <код>
end

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

В условие можно вставлять переменные и следующие операторы сравнения.

== равно
~= не равно
< меньше
<= меньше или равно
> больше
>= больше или равно

Например, если нам надо проверить, что переменная f больше нуля, то используем следующий код.

if f > 0 then
  -- Этот код исполняется, если только f больше нуля
end

Условие допустимо брать в скобки, поэтому запись ниже идентична верхней. Вы сами выбираете тот вариант, который больше нравится.

if (f > 0) then
-- Этот код исполняется, если только f больше нуля
end

Для более сложных случаев применяется оператор else, как показано ниже.

if (f > 0) then
  -- Этот код исполняется, если только f больше нуля
else
  -- Этот код исполняется, если f меньше или равен нулю,
  -- а также если переменная f не является числом
end

Когда требуется сделать проверку сразу нескольких условий, поможет оператор elseif.

if (operator == "+") then r = a + b;
elseif (operator == "-") then r = a - b;
elseif (operator == "*") then r = a*b;
elseif (operator == "/") then r = a/b;
else
  print("Неверный оператор");
end

В данном примере, если переменная operator равна "+", то складываются переменные a и b, а их сумма присваивается r. Дальнейший код в этом случае игнорируется. Если operator не равен "+", то по очереди проверяется, чему он равен и выполняется соответствующая операция. Если значение operator не определено или мы не указали подходящий вариант, то будет выведен текст "Неверный оператор".

Для более сложных условий применяются логические операторы and (И) и or (ИЛИ). Например, нам надо проверить, что число N лежит в диапазоне от 0 до 10 включительно. Тогда подойдёт следующее условие.

if (N >= 0 and N <= 10) then
  -- что-то сделать
end

В данном случае мы проверяем, что N больше или равен 0 и одновременно меньше или равен 10.

Логическое ИЛИ используется, когда нам надо выбрать один из вариантов, но никак не оба. Например, надо выполнить некоторый код в случае, если x или y равен 5. Тогда код будет следующий.

if (x== 5 or y == 5) then
  -- что-то сделать
end


Цикл for

Цикл for применяется для выполнения заданного кода определённое число раз. Синтаксис следующий.

for variable = beginning, finish, step do
-- повторяем код
end

Здесь variable это имя переменной, которая будет увеличиваться с шагом step до значения finish. По умолчанию шаг равен 1, поэтому явно указывать третий параметр не нужно. Например, если нам надо задать 10 шагов, мы напишем следующее.

for i = 1,10 do
  print (i)
end

В данном примере на экран будет выведено число от 1 до 10 включительно.

Шаг приращения не обязательно устанавливать целым, он может быть и дробным (0.5) или отрицательным (-1). Это позволяет делать циклы, в которых счётчик приращений не увеличивается, а наоборот, уменьшается, как показано в примере ниже.

for i = 10, 1, 0.5 do
  print (i)
end

В данном примере будет выведено число от 10 до 1 с шагом 0,5.


Цикл while

В отличие от цикла for, который устанавливает заданное число шагов, цикл while выполняется до тех пор, пока истинно заданное логическое условие. В общем случае цикл записывается так.

while <условие> do
-- что-то делаем
end

Вначале проверяется условие, если оно истинно, то выполняется тело цикла. Перед end условие проверяется ещё раз и если оно по прежнему истинно, то цикл повторяется. В противном случае, цикл завершается.

Легко получить бесконечный цикл, если внутри цикла не изменять значения переменных используемых в условии.

i = 5;
while i < 10 do
  print ("Вечность");
end

В примере выше i всегда будет меньше 10, поскольку его значение никак не меняется внутри цикла, из-за чего цикл никогда не завершится. Заметьте, что это логическая ошибка, но никак не ошибка с точки зрения компилятора. Корректный пример показан ниже.

i = 5;
while i  <= 10 do
  print (i);
  i = i + 0.5;
end

Здесь внутри цикла значение переменной i увеличивается на 0.5, а в условии идёт проверка, что i меньше или равно 10. Будут выведены цифра 5, 5.5, 6, 6.5 и так до 10 включительно.


Функции

Функции могут получать параметры, выполнять заданный код и возвращать значение обратно, в то место, где они были вызваны. Функции обозначаются ключевым словом function и имеют имя, которое не должно совпадать с зарезервированными ключевыми словам и не начинается с цифры. Завершается функция ключевым словом end, как показано в примере ниже.

function sum(a, b)
  return a+b;
end

Здесь функция с именем sum имеет два параметра a и b, которые складываются и возвращаются обратно. Чтобы вызвать нашу функцию, мы пишем её имя и присваиваем результат какой-то переменной или выводим функцию напрямую.

res = sum(3, 7);
print (res);
print(sum(10, 12));

В данном примере результат выполнения функции присваивается переменной res, которая затем выводится на экран. В последней строке мы сразу же выводим результат функции на экран.

Функция не обязательно должна иметь параметры, можно обойтись и без них. Также функция не обязана возвращать какое-либо значение.

function loop()
  for i=1,5 do
    print (i);
  end
end

В данном примере внутри функции применяется цикл, который выводит на экран цифры от 1 до 5.

Как правило, функция пишется ниже основного кода.


Таблицы

Таблицами в Lua называют ассоциированные массивы. Это гибкий и мощный инструмент хранения и манипуляции данными.

Для создания таблицы применяется следующий синтаксис:

t = {};

Вначале пишется желаемое имя таблицы, затем символ равно и пустые фигурные скобки. Также внутри скобок можно сразу же задать желаемые значения, это могут быть цифры, текст, в общем, любые типы данных.

n = { 0, 1, 1, 2, 3, 5, 8 };
d = {
   "понедельник", "вторник", "среда", "четверг",
   "пятница", "суббота", "воскресенье"
};

Обратиться к элементу таблицы можно по его индексу. По умолчанию, первый элемент равен 1. Таким образом, чтобы получить "понедельник" из таблицы d надо написать d[1], как показано ниже.

print (d[1]);

Если нас интересует обращение к элементу по его имени, то следует задать ключи. Это делается двумя способами.

d = {};
-- первый метод
d.mon = "понедельник";
d.tue = "вторник";
d.wed = "среда";
-- второй метод
d = {
  mon = "понедельник",
  tue = "вторник",
  wed = "среда"
};

Обратиться к элементу такой таблицы можно как d.mon или d["mon"].

Одна таблица может содержать в себе другую таблицу, как показано в примере ниже.

player = {};
player.position = { x = 540, y = 120 };
print(player.position.x);

Тогда задать или получить координаты можно по имени player.position.x.