Самоучитель по Lua
Lua — лёгкий скриптовый язык программирования. Создан в Бразилии в 1993 году. Используется в играх (Roblox, World of Warcraft), веб-серверах (Nginx, OpenResty) и встраиваемых системах.
Особенности:
Очень быстрый и компактный
Простой синтаксис
Динамическая типизация (не нужно объявлять тип переменной)
Индексация таблиц с 1, а не с 0
Содержание
Первая программа
Создайте файл hello.lua и напишите:
print("Привет, мир!")
Запуск в терминале:
lua hello.lua
Вывод:
Привет, мир!
Переменные
Переменная — это «коробка с именем», где хранятся данные.
-- Имена могут содержать буквы, цифры и подчёркивание
-- Начинаться должны с буквы или подчёркивания
name = "Анна" -- строка (текст)
age = 25 -- число (целое или дробное)
is_online = true -- булевый тип (правда/ложь)
score = nil -- пустое значение
print(name) -- Анна
print(age + 5) -- 30
Правила именования:
myVar (верблюжий стиль)
my_var (змеиный стиль, рекомендуется)
_private (начинается с подчёркивания)
Нельзя начинать с цифры: 1var — ошибка
Типы данных
| Тип | Описание | Пример |
nil | пустота, отсутствие значения | x = nil |
boolean | истина или ложь | true, false |
number | числа (целые и дробные) | 42, 3.14 |
string | текст в кавычках | «Привет», 'ОК' |
table | контейнер для данных | {1, 2, 3} |
function | функция | function() end |
Проверка типа:
print(type("hello")) -- string
print(type(42)) -- number
print(type(true)) -- boolean
print(type(nil)) -- nil
Ввод и вывод
Вывод на экран:
print("Текст") -- выводит и переводит строку
io.write("Без перевода") -- не переводит строку
Ввод с клавиатуры:
print("Как вас зовут?")
name = io.read() -- читает строку
print("Добро пожаловать, " .. name)
-- Чтение числа
print("Сколько вам лет?")
age = tonumber(io.read()) -- преобразует строку в число
Конкатенация (склеивание строк):
-- Оператор .. склеивает строки
message = "Привет, " .. "мир!"
print(message) -- Привет, мир!
Условные операторы
if (если)
age = 18
if age >= 18 then
print("Вы совершеннолетний")
end
if-else (если-иначе)
age = 16
if age >= 18 then
print("Можете голосовать")
else
print("Вы ещё слишком молоды")
end
if-elseif-else
score = 85
if score >= 90 then
print("Отлично")
elseif score >= 70 then
print("Хорошо")
elseif score >= 50 then
print("Удовлетворительно")
else
print("Неудовлетворительно")
end
Операторы сравнения
| Оператор | Значение | Пример |
== | равно | 5 == 5 → true |
~= | не равно | 5 ~= 3 → true |
< | меньше | 3 < 5 → true |
> | больше | 5 > 3 → true |
⇐ | меньше или равно | 3 ⇐ 3 → true |
>= | больше или равно | 5 >= 5 → true |
Логические операторы
| Оператор | Значение | Пример |
and | И (оба истинны) | true and true → true |
or | ИЛИ (хоть одно) | true or false → true |
not | НЕ (отрицание) | not true → false |
age = 20
has_ticket = true
if age >= 18 and has_ticket then
print("Проходите на концерт")
end
Циклы
while
count = 1
while count <= 5 do
print("Итерация " .. count)
count = count + 1
end
for
-- for переменная = начало, конец, шаг do
for i = 1, 5 do
print(i) -- 1 2 3 4 5
end
-- с шагом 2
for i = 1, 10, 2 do
print(i) -- 1 3 5 7 9
end
repeat-until
x = 10
repeat
print(x)
x = x - 1
until x == 0
break
for i = 1, 10 do
if i == 5 then
break -- выход из цикла
end
print(i) -- 1 2 3 4
end
Таблицы
Таблица — главная структура данных в Lua.
Таблица как список (массив)
-- Создание
fruits = {"яблоко", "банан", "апельсин"}
-- Доступ по индексу (индексация С 1!)
print(fruits[1]) -- яблоко
print(fruits[2]) -- банан
-- Изменение элемента
fruits[2] = "груша"
-- Добавление элемента
fruits[4] = "киви"
-- Длина таблицы (#)
print(#fruits) -- 4
-- Перебор с ipairs
for index, value in ipairs(fruits) do
print(index .. ": " .. value)
end
Таблица как словарь
-- Создание
person = {
name = "Иван",
age = 30,
city = "Москва"
}
-- Доступ через точку
print(person.name) -- Иван
-- Доступ через квадратные скобки
print(person["age"]) -- 30
-- Перебор словаря (pairs)
for key, value in pairs(person) do
print(key .. " = " .. value)
end
Вложенные таблицы
students = {
{name = "Анна", grade = 5},
{name = "Олег", grade = 4},
{name = "Мария", grade = 5}
}
print(students[1].name) -- Анна
print(students[2].grade) -- 4
Функции
Объявление и вызов
-- Простая функция
function greet()
print("Привет!")
end
greet() -- вызов
-- Функция с параметрами
function greet_person(name)
print("Привет, " .. name .. "!")
end
greet_person("Анна")
-- Функция с возвращаемым значением
function add(a, b)
return a + b
end
result = add(5, 3)
print(result) -- 8
Локальные переменные
-- global (глобальная) — видна везде
global_var = 10
function test()
local local_var = 20 -- локальная — видна только внутри
global_var = 30
end
test()
print(global_var) -- 30
Анонимные функции
-- Функцию можно присвоить переменной
say_hello = function(name)
print("Hello, " .. name)
end
say_hello("John")
-- Функция может принимать другую функцию
function apply(func, value)
return func(value)
end
double = function(x) return x * 2 end
print(apply(double, 5)) -- 10
Справочник символов
Арифметические операторы
| Символ | Название | Пример | Результат |
+ | сложение | 5 + 3 | 8 |
- | вычитание | 5 - 3 | 2 |
* | умножение | 5 * 3 | 15 |
/ | деление | 5 / 2 | 2.5 |
| целочисленное деление| 5 2 | 2 | | |
% | остаток от деления | 5 % 2 | 1 |
^ | возведение в степень | 2^3 | 8 |
Операторы сравнения
| Символ | Название | Пример | Результат |
== | равно | 5 == 5 | true |
~= | не равно | 5 ~= 3 | true |
< | меньше | 3 < 5 | true |
> | больше | 5 > 3 | true |
⇐ | меньше или равно | 3 ⇐ 3 | true |
>= | больше или равно | 5 >= 5 | true |
Логические операторы
| Символ | Название | Пример | Результат |
and | логическое И | true and false | false |
or | логическое ИЛИ | true or false | true |
not | логическое НЕ | not true | false |
Специальные символы
| Символ | Название | Описание | Пример |
= | присваивание | присваивает значение переменной | x = 5 |
.. | конкатенация | склеивает строки | «a»..«b» → «ab» |
# | длина | длина строки или таблицы | #«hello» → 5 |
… | vararg | переменное количество аргументов | function f(…) |
: | метод | синтаксический сахар для методов | obj:method() |
– | комментарий | однострочный комментарий | – текст |
– начало блока | многострочный комментарий | ''--[[ текст | | | |
Управляющие последовательности
| Последовательность | Значение |
\n | перевод строки |
\t | табуляция |
\\ | обратный слеш |
\« | двойная кавычка |
\' | одинарная кавычка |
Справочник функций
Ввод/вывод
| Функция | Описание |
print(…) | выводит значения, с переводом строки |
io.write(…) | выводит без перевода строки |
io.read() | читает строку из ввода |
io.read(«*n») | читает число |
Преобразование
| Функция | Описание |
tonumber(s) | преобразует строку в число |
tostring(n) | преобразует число в строку |
type(v) | возвращает тип значения |
Математические (math.*)
| Функция | Описание | Пример |
math.abs(x) | абсолютное значение | math.abs(-5) → 5 |
math.floor(x) | округление вниз | math.floor(3.7) → 3 |
math.ceil(x) | округление вверх | math.ceil(3.2) → 4 |
math.random() | случайное от 0 до 1 | math.random() |
math.random(n) | случайное от 1 до n | math.random(10) |
math.random(a,b) | случайное от a до b | math.random(5,15) |
math.min(a,b) | минимальное значение | math.min(3,1,4) → 1 |
math.max(a,b) | максимальное значение | math.max(3,1,4) → 4 |
math.sqrt(x) | квадратный корень | math.sqrt(9) → 3 |
math.pi | число Пи (константа) | math.pi → 3.14159 |
Строковые (string.*)
| Функция | Описание | Пример |
string.len(s) | длина строки | string.len(«abc») → 3 |
string.upper(s) | в верхний регистр | string.upper(«abc») → «ABC» |
string.lower(s) | в нижний регистр | string.lower(«ABC») → «abc» |
string.sub(s,i,j) | подстрока | string.sub(«hello»,2,4) → «ell» |
string.find(s,p) | поиск подстроки | string.find(«hello»,»el«) → 2 |
string.rep(s,n) | повторение строки | string.rep(«hi»,3) → «hihihi» |
Табличные (table.*)
| Функция | Описание |
table.insert(t,v) | вставляет в конец |
table.insert(t,i,v) | вставляет на позицию i |
table.remove(t) | удаляет последний элемент |
table.remove(t,i) | удаляет элемент на позиции i |
table.sort(t) | сортирует таблицу |
table.concat(t,sep) | объединяет таблицу в строку |
Полный пример: игра «Угадай число»
-- Игра «Угадай число»
math.randomseed(os.time())
secret_number = math.random(1, 100)
attempts = 0
max_attempts = 10
guessed = false
print("=" :rep(40))
print(" Добро пожаловать в игру 'Угадай число'")
print("=" :rep(40))
print("Я загадал число от 1 до 100.")
print("У вас есть " .. max_attempts .. " попыток.")
print()
while not guessed and attempts < max_attempts do
print("Попытка " .. (attempts + 1) .. " из " .. max_attempts)
io.write("Ваше число: ")
local input = io.read()
local guess = tonumber(input)
if guess == nil then
print("Ошибка: введите число!\n")
goto continue
end
attempts = attempts + 1
if guess < 1 or guess > 100 then
print("Число должно быть от 1 до 100!\n")
goto continue
end
if guess == secret_number then
print("\nПоздравляю! Вы угадали число " .. secret_number .. "!")
print("Количество попыток: " .. attempts)
guessed = true
elseif guess < secret_number then
print("Загаданное число БОЛЬШЕ\n")
else
print("Загаданное число МЕНЬШЕ\n")
end
::continue::
end
if not guessed then
print("\nК сожалению, вы не угадали.")
print("Было загадано число: " .. secret_number)
end
print("\nСпасибо за игру!")
Полезные советы
Используйте локальные переменные везде, где возможно — они быстрее.
Индексация с 1 — запомните это, чтобы не путаться.
Проверяйте ввод пользователя через tonumber().
Комментируйте код — через месяц вы забудете, что он делает.
Изучайте ошибки — Lua даёт понятные сообщения.
Дополнительные ресурсы