docs:lua

Самоучитель по 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.pi3.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 даёт понятные сообщения.
  • docs/lua.txt
  • Последнее изменение: 20 ч. назад
  • admin