====== Самоучитель по Lua ======
[[https://www.lua.org|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 даёт понятные сообщения.
===== Дополнительные ресурсы =====
* [[https://www.lua.org|Официальный сайт Lua]]
* [[https://www.lua.org/manual/5.4/|Документация Lua 5.4]]
* [[https://replit.com/languages/lua|Онлайн-песочница Replit]]
----
//[[antistatus@mail.ru|Antistatus]] 15.04.2026 07:52//