Перейти к содержимому

Стандартные библиотеки Lua

Базовые библиотеки Lua, автоматически доступные во всех процессах Wippy. Не требуют require().

type(value) -- Возвращает: "nil", "number", "string", "boolean", "table", "function", "thread", "userdata"
tonumber(s [,base]) -- Преобразовать в число, опциональное основание (2-36)
tostring(value) -- Преобразовать в строку, вызывает метаметод __tostring
assert(v [,msg]) -- Выбрасывает ошибку если v false/nil, иначе возвращает v
error(msg [,level]) -- Выбрасывает ошибку на указанном уровне стека (по умолчанию 1)
pcall(fn, ...) -- Защищённый вызов, возвращает ok, result_or_error
xpcall(fn, errh) -- Защищённый вызов с функцией-обработчиком ошибок
pairs(t) -- Итерация по всем парам ключ-значение
ipairs(t) -- Итерация по массивной части (1, 2, 3, ...)
next(t [,index]) -- Получить следующую пару ключ-значение после index
getmetatable(obj) -- Получить метатаблицу (или поле __metatable если защищено)
setmetatable(t, mt) -- Установить метатаблицу, возвращает t

Обход метаметодов для прямого доступа к таблице:

rawget(t, k) -- Получить t[k] без __index
rawset(t, k, v) -- Установить t[k]=v без __newindex
rawequal(a, b) -- Сравнить без __eq
select(index, ...) -- Вернуть аргументы начиная с index
select("#", ...) -- Вернуть количество аргументов
unpack(t [,i [,j]]) -- Вернуть t[i] до t[j] как множественные значения
print(...) -- Вывести значения (использует структурированное логирование в Wippy)
_G -- Глобальная таблица окружения
_VERSION -- Строка версии Lua

Функции для модификации таблиц:

table.insert(t, [pos,] value) -- Вставить значение в позицию pos (по умолчанию: конец)
table.remove(t [,pos]) -- Удалить и вернуть элемент в позиции pos (по умолчанию: последний)
table.concat(t [,sep [,i [,j]]]) -- Конкатенировать элементы массива с разделителем
table.sort(t [,comp]) -- Сортировать на месте, comp(a,b) возвращает true если a < b
table.pack(...) -- Упаковать varargs в таблицу с полем 'n'
table.unpack(t [,i [,j]]) -- Распаковать элементы таблицы как множественные значения
local items = {"a", "b", "c"}
table.insert(items, "d") -- {"a", "b", "c", "d"}
table.insert(items, 2, "x") -- {"a", "x", "b", "c", "d"}
table.remove(items, 2) -- {"a", "b", "c", "d"}, возвращает "x"
local csv = table.concat(items, ",") -- "a,b,c,d"
table.sort(items, function(a, b)
return a > b -- По убыванию
end)

Функции работы со строками. Также доступны как методы строковых значений:

string.find(s, pattern [,init [,plain]]) -- Найти паттерн, возвращает start, end, captures
string.match(s, pattern [,init]) -- Извлечь соответствующую подстроку
string.gmatch(s, pattern) -- Итератор по всем совпадениям
string.gsub(s, pattern, repl [,n]) -- Заменить совпадения, возвращает строку, количество
string.upper(s) -- Преобразовать в верхний регистр
string.lower(s) -- Преобразовать в нижний регистр
string.sub(s, i [,j]) -- Подстрока от i до j (отрицательные индексы с конца)
string.len(s) -- Длина строки (или используйте #s)
string.byte(s [,i [,j]]) -- Числовые коды символов
string.char(...) -- Создать строку из кодов символов
string.rep(s, n [,sep]) -- Повторить строку n раз с разделителем
string.reverse(s) -- Перевернуть строку
string.format(fmt, ...) -- Форматирование в стиле printf

Спецификаторы формата: %d (целое), %f (дробное), %s (строка), %q (в кавычках), %x (hex), %o (octal), %e (научная нотация), %% (буквальный %)

local s = "Hello, World!"
-- Поиск по паттерну
local start, stop = string.find(s, "World") -- 8, 12
local word = string.match(s, "%w+") -- "Hello"
-- Замена
local new = string.gsub(s, "World", "Wippy") -- "Hello, Wippy!"
-- Синтаксис методов
local upper = s:upper() -- "HELLO, WORLD!"
local part = s:sub(1, 5) -- "Hello"
ПаттернСоответствует
.Любой символ
%aБуквы
%dЦифры
%wБуквы и цифры
%sПробельные символы
%pПунктуация
%cУправляющие символы
%xШестнадцатеричные цифры
%zНоль (null)
[set]Класс символов
[^set]Отрицание класса
*0 или более (жадный)
+1 или более (жадный)
-0 или более (ленивый)
?0 или 1
^Начало строки
$Конец строки
%b()Сбалансированная пара
(...)Группа захвата

Версии в верхнем регистре (%A, %D и т.д.) соответствуют дополнению.

Математические функции и константы:

math.pi -- 3.14159...
math.huge -- Бесконечность
math.mininteger -- Минимальное целое
math.maxinteger -- Максимальное целое
math.abs(x) -- Абсолютное значение
math.min(...) -- Минимум из аргументов
math.max(...) -- Максимум из аргументов
math.floor(x) -- Округление вниз
math.ceil(x) -- Округление вверх
math.modf(x) -- Целая и дробная части
math.fmod(x, y) -- Остаток от деления с плавающей точкой
math.sqrt(x) -- Квадратный корень
math.pow(x, y) -- x^y (или используйте оператор x^y)
math.exp(x) -- e^x
math.log(x [,base]) -- Натуральный логарифм (или логарифм по основанию n)
math.sin(x) math.cos(x) math.tan(x) -- Радианы
math.asin(x) math.acos(x) math.atan(y [,x])
math.sinh(x) math.cosh(x) math.tanh(x) -- Гиперболические
math.deg(r) -- Радианы в градусы
math.rad(d) -- Градусы в радианы
math.random() -- Случайное дробное [0,1)
math.random(n) -- Случайное целое [1,n]
math.random(m, n) -- Случайное целое [m,n]
math.randomseed(x) -- Установить seed
math.tointeger(x) -- Преобразовать в целое или nil
math.type(x) -- "integer", "float" или nil
math.ult(m, n) -- Беззнаковое сравнение меньше

Создание и управление корутинами. См. Каналы и корутины для каналов и паттернов конкурентности:

coroutine.create(fn) -- Создать корутину из функции
coroutine.resume(co, ...) -- Запустить/продолжить корутину
coroutine.yield(...) -- Приостановить корутину, вернуть значения в resume
coroutine.status(co) -- "running", "suspended", "normal", "dead"
coroutine.running() -- Текущая корутина (nil если главный поток)
coroutine.wrap(fn) -- Создать корутину как вызываемую функцию

Запуск конкурентной корутины, работающей независимо (специфика Wippy):

coroutine.spawn(fn) -- Запустить функцию как конкурентную корутину
-- Фоновая задача
coroutine.spawn(function()
while true do
check_health()
time.sleep("30s")
end
end)
-- Продолжить основное выполнение немедленно
process_request()

Создание и классификация структурированных ошибок. См. Обработка ошибок для полной документации:

errors.UNKNOWN -- Неклассифицированная ошибка
errors.INVALID -- Неверный аргумент или ввод
errors.NOT_FOUND -- Ресурс не найден
errors.ALREADY_EXISTS -- Ресурс уже существует
errors.PERMISSION_DENIED -- Доступ запрещён
errors.TIMEOUT -- Истекло время операции
errors.CANCELED -- Операция отменена
errors.UNAVAILABLE -- Сервис недоступен
errors.INTERNAL -- Внутренняя ошибка
errors.CONFLICT -- Конфликт (например, параллельная модификация)
errors.RATE_LIMITED -- Превышен лимит запросов
-- Создать ошибку из строки
local err = errors.new("something went wrong")
-- Создать ошибку с метаданными
local err = errors.new({
message = "User not found",
kind = errors.NOT_FOUND,
retryable = false,
details = {user_id = 123}
})
-- Обернуть существующую ошибку с контекстом
local wrapped = errors.wrap(err, "failed to load profile")
-- Проверить тип ошибки
if errors.is(err, errors.NOT_FOUND) then
-- обработать не найдено
end
-- Получить стек вызовов из ошибки
local stack = errors.call_stack(err)
err:message() -- Получить сообщение ошибки
err:kind() -- Получить тип ошибки (например, "NOT_FOUND")
err:retryable() -- true, false или nil (неизвестно)
err:details() -- Получить таблицу деталей или nil
err:stack() -- Получить стек трейс как строку

Обработка UTF-8 строк:

utf8.charpattern -- Паттерн, соответствующий одному UTF-8 символу
utf8.char(...) -- Создать строку из Unicode codepoints
utf8.codes(s) -- Итератор по codepoints: for pos, code in utf8.codes(s)
utf8.codepoint(s [,i [,j]]) -- Получить codepoints в позициях от i до j
utf8.len(s [,i [,j]]) -- Посчитать UTF-8 символы (не байты)
utf8.offset(s, n [,i]) -- Позиция в байтах n-го символа от позиции i
local s = "Hello, 世界"
-- Подсчёт символов (не байтов)
print(utf8.len(s)) -- 9
-- Итерация по codepoints
for pos, code in utf8.codes(s) do
print(pos, code, utf8.char(code))
end
-- Получить codepoint в позиции
local code = utf8.codepoint(s, 8) -- Первый китайский символ
-- Создать строку из codepoints
local emoji = utf8.char(0x1F600) -- Улыбающееся лицо

Следующие стандартные возможности Lua НЕ доступны из соображений безопасности:

ВозможностьАльтернатива
load, loadstring, loadfile, dofileИспользуйте модуль Динамическое выполнение
collectgarbageАвтоматический GC
rawlenИспользуйте оператор #
io.*Используйте модуль Файловая система
os.execute, os.exit, os.remove, os.rename, os.tmpnameИспользуйте модули Выполнение команд, Окружение
debug.* (кроме traceback)Недоступно
package.loadlibНативные библиотеки не поддерживаются