Шпаргалка по Lua
Последнее обновление
Hello World и запуск кода
Lua минималистичен - запускается одна инструкция.
| Операция | Синтаксис |
|---|---|
| Вывести строку | print("Hello, World!") |
| Вывести несколько значений | print("x", 1, true) |
| Запись без перевода строки | io.write("Hi") |
| Комментарий | -- this is a comment |
| Многострочный комментарий | --[[ ... ]] |
| Конкатенация строк | print("Hi " .. name) |
| Запустить файл | lua app.lua |
| Интерактивная оболочка | lua |
Переменные и типы
Переменные по умолчанию глобальны; объявляйте локальные через local.
| Операция | Синтаксис |
|---|---|
| Локальная переменная | local age = 30 |
| Глобальная переменная | count = 0 |
| Множественное присваивание | local a, b = 1, 2 |
| Восемь типов | nil, boolean, number, string, table, function, userdata, thread |
| Nil / логические | nil, true, false |
| Узнать тип | type(x) возвращает "number" |
| Преобразовать в число | tonumber("42") |
| Преобразовать в строку | tostring(42) |
Строки
Строки неизменяемы; работают и одинарные, и двойные кавычки.
| Операция | Синтаксис |
|---|---|
| Длина | #s или string.len(s) |
| Конкатенация | s1 .. s2 |
| Верхний / нижний регистр | s:upper(), s:lower() |
| Подстрока | s:sub(1, 3) |
| Найти подстроку | s:find("ell") |
| Замена (gsub) | s:gsub("a", "b") |
| Форматирование | string.format("%05d", 42) |
| Длинная строка | [[ multi\nline ]] |
Таблицы (основная структура данных)
Таблицы - единственный структурный тип в Lua: они служат массивами, мапами и объектами.
| Операция | Синтаксис |
|---|---|
| Пустая таблица | local t = {} |
| Как массив (с индекса 1) | local t = {10, 20, 30} |
| Доступ к элементу массива | t[1] (первый элемент) |
| Таблица как мапа | local u = {name = "Ada", age = 30} |
| Доступ к значению мапы | u.name или u["name"] |
| Задать значение | t[4] = 40, u.email = "a@x.com" |
| Длина массивной части | #t |
| Перебор массива (ipairs) | for i, v in ipairs(t) do ... end |
| Перебор всех ключей (pairs) | for k, v in pairs(u) do ... end |
| Вложенная таблица | local m = {a = {1, 2}} |
Управление потоком
Блоки закрываются через end; ложными являются только nil и false.
| Операция | Синтаксис |
|---|---|
| If / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| Логические операторы | and, or, not |
| Числовой for | for i = 1, 10 do ... end |
| For с шагом | for i = 10, 1, -1 do ... end |
| Цикл while | while x < 100 do ... end |
| Repeat-until | repeat ... until done |
| Break | break |
| Оператор неравенства | if a ~= b then ... end |
Функции
Функции - значения первого класса и могут возвращать несколько результатов.
| Операция | Синтаксис |
|---|---|
| Определить функцию | function add(a, b) return a + b end |
| Локальная функция | local function square(x) return x * x end |
| Анонимная функция | local f = function(x) return x * 2 end |
| Несколько возвращаемых значений | function bounds() return 1, 10 end |
| Захватить несколько возвратов | local lo, hi = bounds() |
| Вариативная функция | function sum(...) ... end |
| Собрать varargs | local args = {...} |
| Метод (синтаксис с двоеточием) | function obj:greet() ... end |
Библиотека string
Частые функции из библиотеки string (вызываемые как s:fn()).
| Функция | Что делает |
|---|---|
string.len(s) | Длина строки |
string.sub(s, i, j) | Подстрока от индекса i до j |
string.upper(s) | Копия в верхнем регистре |
string.rep(s, n) | Повторить строку n раз |
string.find(s, p) | Найти шаблон, возвращает начало/конец |
string.match(s, p) | Вернуть первое совпадение с шаблоном |
string.gsub(s, p, r) | Заменить все совпадения с шаблоном |
string.format(fmt, ...) | Отформатировать значения в строку |
Библиотеки table и math
Помощники для работы с массивными таблицами и числами.
| Функция | Что делает |
|---|---|
table.insert(t, v) | Добавить значение в конец |
table.insert(t, i, v) | Вставить v на позицию i |
table.remove(t, i) | Удалить и вернуть элемент на позиции i |
table.concat(t, ", ") | Объединить элементы в строку |
table.sort(t) | Отсортировать массив на месте |
math.floor(x) / math.ceil(x) | Округлить вниз / вверх |
math.max(...) / math.min(...) | Наибольший / наименьший аргумент |
math.random(1, 6) | Случайное целое в диапазоне |
Метатаблицы (кратко)
Метатаблицы позволяют настраивать поведение таблиц - операторы, индексирование и многое другое.
| Операция | Синтаксис |
|---|---|
| Задать метатаблицу | setmetatable(t, mt) |
| Получить метатаблицу | getmetatable(t) |
| Запасной вариант для отсутствующих ключей | mt.__index = defaults |
| Значение по умолчанию через функцию | mt.__index = function(t, k) ... end |
| Настроить сложение | mt.__add = function(a, b) ... end |
| Настроить tostring | mt.__tostring = function(t) ... end |
| ООП на основе прототипов | mt.__index = ClassTable |
Синтаксис Lua, который нужен чаще всего, на одной странице. Эта шпаргалка по Lua - быстрый справочник по ядру языка: переменные и типы, строки, управление потоком, функции и таблицы, которые служат единственной гибкой структурой данных в Lua, а также краткий обзор стандартных библиотек и метатаблиц.
Всё здесь - стандартный Lua, который работает на обычном интерпретаторе. Копируйте нужное или попробуйте каждый фрагмент вживую в playground для Lua - без установки.
Часто задаваемые вопросы по шпаргалке Lua
Эта шпаргалка по Lua бесплатна?
Как таблица Lua может быть и массивом, и мапой?
{10, 20, 30}), таблица ведёт себя как массив; когда вы используете строковые ключи ({name = "Ada"}), она ведёт себя как мапа. Вы даже можете смешивать оба варианта в одной таблице. Поэтому Lua нужен лишь один структурный тип - таблица покрывает массивы, словари, множества и объекты.Почему в Lua индексация с 1?
t[1] - первый элемент, а #t - их количество. Оператор длины # и библиотечные функции вроде table.insert и ipairs исходят из соглашения о начале с 1, поэтому придерживаясь его, вы сохраняете ожидаемое поведение кода с массивами.