Lua
local content = file:read("*a")
Практичний висновок: C/C++ часто відповідає за продуктивне ядро, а Lua — за сценарії, конфігурацію й змінну логіку.; Lua має змогу бути не найкращим вибором для: Lua має змогу читати й писати файли через `io`.; * Programming in Lua.; Перевага: Lua не намагається бути великою універсальною платформою.; else Lua має змогу використовуватися як: print(config.features.cache)
Redis Lua scripts
</syntaxhighlight>
</syntaxhighlight>
- файлову систему;
- мережу;
- `os.execute`;
- debug library;
- доступ до глобальних змінних;
- небезпечні API;
- час виконання;
- пам’ять;
- зовнішні модулі.;== Lua і C ==
</syntaxhighlight> }
Lua часто використовують у game development, embedded scripting, Neovim-конфігураціях, OpenResty/Nginx, Redis scripts, IoT, plugins, automation tools і застосунках, які потребують простого скриптового шару поверх основної системи.; * паролі;
* tokens;
* API keys;
* приватні файли;
* персональні інформаційні дані;
* production secrets;
* внутрішні endpoints;
* системні команди;
* доступ до логів;
* необмежений доступ до host application.; port = 8080,
</div>
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
== Metatables ==
Приклад модуля `math_utils.lua`:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Функція в Lua оголошується через `function`.;
На платформі Roblox застосовують, коли потрібно Lua-подібна мова Luau.; * game scripting;
- логіка ігрових персонажів;
- конфігурація редакторів;
- плагіни;
- embedded rules;
- сценарії автоматизації;
- швидкі runtime-налаштування;
- lightweight DSL;
- Nginx/OpenResty scripting;
- Redis atomic scripts;
- UI scripting;
- модифікації ігор;
- інтеграційні функціональні можливості з C/C++;
- sandboxed scripts.; `nil` означає відсутність значення.;
})
</syntaxhighlight>
- `__index`;
- `__newindex`;
- `__tostring`;
- `__call`;
- `__add`;
- `__sub`;
- `__mul`;
- `__eq`;
- `__lt`;
- `__le`;
- `__len`.; end
Lua підтримує роботу повернення кількох значень із функції.; Суть умов: Lua використовує `then`, `elseif`, `else` і `end`, з цієї причини блоки читаються явно.; Критерій
Тематичні мітки
print(user ["age"])
Локальна змінна:
Приклад: Coroutines використовуються для:
→ loads Lua script
local function divide(a, b)
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
return current
print(user:greet())
host = "localhost",
Глобальна змінна:
return "User: " ..;== Функції ==
} У сучасних версіях Lua можуть відрізнятися integer і float-представлення, але для багатьох скриптових задач це приховано від користувача.;== Коли Lua має змогу бути невдалим вибором ==
Типи даних
- atomic operations;
- custom commands;
- counters;
- locks;
- rate limiting;
- queue logic;
- перевірки й актуалізація кількох ключів;
- зменшення кількості round trips.; * Neovim Lua documentation.;
Поширені помилки: </syntaxhighlight>
sum = sum + value
Критично: FFI дає велику силу, але додатково має змогу створювати ризики безпеки, memory bugs і залежність від платформи.; end
- `string`;
- `table`;
- `math`;
- `io`;
- `os`;
- `debug`;
- `coroutine`;
- `utf8`;
- `package`.;
Довгі рядки можна писати так:
print("No value")
for key, value in pairs(user) do Lua в OpenResty має змогу використовуватися для:
name = "Alice"Практична роль: Lua часто є собою “мовою всередині програми”, а не окремою великою платформою сама по собі.;
</div>
</div>
Lua-код виконується зверху вниз, без обов’язкової функції `main`.; це легка, швидка, динамічна скриптова мова програмування, розроблена; додатково реалізовано автоматизації, конфігурацій, ігрової логіки, плагінів, розширень і сценаріїв, де потрібен компактний runtime виступає ключовою рисою вбудовування в інші застосунки забезпечується через '''Lua'''.; * LÖVE documentation.;<syntaxhighlight lang="lua">
== Висновок ==
}
return
Приклад ідеї:
}
Lua відома простим синтаксисом.; counter:increment()
vim.keymap.set("n", "<leader>w", ":w<CR>")
local obj = { value = 0 }
local age = 25
<syntaxhighlight lang="lua">
for i = 1, 5 do </syntaxhighlight>
Tables
if not file then Counter.__index = Counter
<syntaxhighlight lang="bash">
local count = 0
Lua scripts у Redis корисні для:
name = name
</div>
Суть coroutines: виконання можна призупинити й продовжити пізніше, але керування залишається кооперативним.; Простий приклад: істотно: під час роботи з файлами потрібно перевіряти, чи файл успішно відкритий, і закривати його після використання.; self.name print(user.role)
end
}
end
</syntaxhighlight>
</syntaxhighlight>
local items = {"a", "b", "c"}
Перевага для ігор: Lua надає можливість дизайнерам і розробникам оперативно змінювати gameplay-логіку без зміни основного engine-коду.; Приклад: print(items [3]) -- c
lua hello.lua
name = "Alice",Для проходу по таблицях використовують `pairs` і `ipairs`.; !;
Game scripting
істотно: у Lua `nil` часто означає і “значення немає”, і “ключ відсутній у таблиці”.; local function add(a, b) </syntaxhighlight>
print("Active")
істотно: плутанина між `.` і `:` є собою частою помилкою в Lua, особливо в object-like коді.; print(key, value)
function love.draw()
Lua використовує тип `number` для чисел.; Якщо значення не має бути глобальним, потрібно писати `local`.; C/C++ application </syntaxhighlight>
</syntaxhighlight>
local missing = nil Практична роль: Lua добре підходить для простих обчислень, конфігурацій і ігрової логіки.; local count = 0 Metamethods — спеціальні поля metatable, які починаються з `__`.; * `local` для локальних змінних;
- `nil` для відсутності значення;
- `..` для конкатенації рядків;
- `then`, `do`, `end` для блоків;
- таблиці як головна структура даних;
- функції як значення;
- динамічна типізація.;
Приклад `__tostring`:
Увага: на відміну від багатьох мов, у Lua число `0` не є собою false.;Lua і JavaScript
Кілька умов:
<syntaxhighlight lang="lua">
debug = true,
return obj
</div>
'''Суть прикладу:''' Lua надає можливість дуже оперативно написати й виконати простий скрипт.; return a * b
print(multiply(2, 3))
end
Основні модулі:
<syntaxhighlight lang="lua">
print(counter())
* виконання сторонніх скриптів;
* доступ до `io`;
* доступ до `os`;
* `debug` library;
* FFI;
* глобальні змінні;
* injection у скриптах;
* небезпечні plugins;
* нескінченні цикли;
* витрати пам’яті;
* доступ до host application API.;<syntaxhighlight lang="lua">
'''Практична роль:''' Lua надає можливість основній програмі залишатися на C/C++, а сценарії й правила змінювати без перекомпіляції всієї системи.; * Redis Lua scripting documentation.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
debug = true,
print(counter())
end)
__tostring = function(t)
return {
Цикли
Конфігураційна таблиця
local M = {}
- конфігураційний рушій;
- scripting layer;
- plugin language;
- rule engine;
- game logic layer;
- automation runtime;
- user-customizable extension system.;</syntaxhighlight>
vim.opt.shiftwidth = 2
<syntaxhighlight lang="lua">
!; Виклик через двокрапку:
'''Висновок:''' JavaScript домінує у web, а Lua часто сильніша там, де потрібна маленька вбудована мова.; err)
coroutine.yield()
local M = {}
local text = [[
This is a long string.
It can contain multiple lines.
]]
for index, value in ipairs(items) do
'''Критично:''' якщо Lua-скрипти пишуть користувачі або сторонні розробники, їх не можна виконувати без sandbox і контролю доступів.; Окремо варто відзначити компактною реалізацією, швидким запуском, малою вагою й зручністю інтеграції з C і C++.; function Counter:increment()
</div>
return a + b
print("Minor")
print(count)
end
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
end
</div>
</div>
<syntaxhighlight lang="lua">
'''Практична роль:''' Lua в OpenResty надає можливість додавати гнучку логіку до Nginx без написання окремого backend-сервісу для кожного правила.; setmetatable(obj, self)
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
}
У Lua лише `false` і `nil` вважаються false-like.; name)
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Основні переважні аспекти Lua:
!; local defaults = {
</div>
'''Практична роль:''' Lua має небагато базових типів, але таблиці й функції роблять мову дуже гнучкою.; '''Підказка:''' у Lua істотно дивитися не лише на синтаксис, а й на те, у якому runtime або host application виконується скрипт.; Двокрапка автономно передає об’єкт як перший аргумент `self`.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
end
|-
| Роль
| Скриптова логіка
| Низькорівнева основа застосунку
|-
| Виконання
| Інтерпретатор або JIT
| Компіляція
|-
| Пам’ять
| Автоматичне керування
| Ручне керування
|-
| Сила
| Гнучкість і швидкі зміни
| Продуктивність і контроль
|-
| Типове поєднання
| Lua scripts керують поведінкою
| C/C++ application надає API
|}
redis.call("SET", KEYS [1], ARGV [1])
== Number ==
</div>
end
- простий синтаксис;
- малий runtime;
- швидкий запуск;
- легке вбудовування;
- хороша інтеграційні функціональні можливості з C/C++;
- таблиці як універсальна структура;
- функції як first-class values;
- closures;
- coroutines;
- metatables;
- LuaJIT;
- придатність для game scripting;
- зручність для конфігурацій;
- переносимість;
- невелика складність мови.; repeat
end
local count = 3
if 0 then
User.__index = User
== Хороші практики Lua ==
'''Перевага синтаксису:''' Lua без зайвих зусиль читати й оперативно вивчати, особливо для скриптових задач.;<syntaxhighlight lang="lua">
print(user.age)
error("Something went wrong")
name = "Alice",
Lua була розроблена в Бразилії як мова для конфігурацій і вбудованих сценаріїв.; if not ok then
'''Увага:''' індексація з 1 має змогу бути незвичною для програмістів, які прийшли з C, JavaScript, Python, Java або Rust.;
Nil
local user = User:new("Alice")
print("Name: " ..; result) Lua в Neovim застосовується для:
if current then
Приклад: local sum = 0 `ipairs` для масивної частини:
Приклади:
end
* API gateways;
* routing;
* rate limiting;
* authentication;
* request processing;
* response transformation;
* caching logic;
* lightweight backend behavior;
* high-performance web logic.; end
Lua має компактний і читабельний синтаксис.; {| class="wikitable"
error("Failed")
local user = {
return count
Двокрапка і крапка
{{SEO
local items = {"a", "b", "c"} end
</syntaxhighlight>
end
Приклад концепції:
Coroutine — це механізм кооперативного multitasking.; JavaScript
Критично: випадкова глобальна змінна — одна з типових помилок у Lua.;Sandbox має змогу обмежувати:
== Перша програма на Lua ==
port = 8080,
Рядки в Lua є собою immutable.; Її сила — у простоті, компактності й легкому вбудовуванні в інші системи.; Критерій
</div>
if age >= 18 then
return "Hello, " ..; → exposes selected functions to Lua
print(a + b)
print("Adult")
print(a / b)
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
return a / b, nil
* офіційно затверджений сайт Lua.; C
Загальний характеристика
function Counter:new() У Lua є собою значення `true` і `false`.; print(items [2]) -- b
</div>
Особливості синтаксису:
local age = 20
</div>
user.greet(user)
<syntaxhighlight lang="lua">
local config = {
local numbers = {1, 2, 3, 4, 5}
local value = nil
end
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
LuaJIT часто використовують там, де потрібна швидкість Lua-коду або ефективна інтеграційні функціональні можливості з C.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
!;
Змінні
for _, value in ipairs(numbers) do
print(counter.value)
end
local first = "Hello"
function M.greet(name)
Функції є собою значеннями:
<syntaxhighlight lang="lua">
</div>
return nil, "division by zero"
else
'''Практична користь:''' довгі рядки Lua зручні для конфігурацій, шаблонів і вбудованих текстів.; Lua застосовується для:
переважні аспекти Lua-конфігурацій:
<syntaxhighlight lang="lua">
</syntaxhighlight>
</div>
* логіки персонажів;
* сценаріїв рівнів;
* UI;
* квестів;
* модів;
* поведінки NPC;
* event scripts;
* конфігурації gameplay;
* швидкого iterating без повної перекомпіляції.; * OpenResty documentation.; t.name
=== Простий об’єктний стиль ===
user.age = nil
return ARGV [1]
'''істотно:''' Lua історично створювалася як вбудовувана мова, з цієї причини її дизайн сильно орієнтований на простоту інтеграції з іншими програмами.; Оскільки Lua часто виконує користувацькі скрипти, істотно обмежувати доступи.; Використання:
String
Modules
Див.; додатково
Обмеження Lua
print("Cannot open file")
OpenResty використовує Lua для програмованої логіки на базі Nginx.;== Приватність даних ==
Sandbox
Приклад ідеї:
- embedded scripting;
- конфігурації з логікою;
- плагіни;
- game scripting;
- швидкі сценарії;
- lightweight runtime;
- C/C++ integration;
- user-defined rules;
- sandboxed scripts;
- Neovim configuration;
- Redis scripts;
- OpenResty logic;
- автоматизація процесів всередині застосунку.; local age = 25
print("Error: " ..; Lua
Приклад:
print(count)
'''Практична роль:''' модулі дозволяють організовувати Lua-код і не забруднювати глобальний простір імен.; Назва '''Lua''' португальською означає “Місяць”.; print(a * b)
count = count + 1
setmetatable(user, {
</div>
Redis підтримує роботу Lua scripts для виконання логіки всередині Redis.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
end
__index = defaults
'''Metatable''' — це спеціальна таблиця, яка змінює поведінку іншої таблиці.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
end
local current = redis.call("GET", KEYS [1])
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
features = {
features = {
function M.multiply(a, b)
- 2D-ігор;
- прототипів;
- навчання;
- game jams;
- small indie games;
- експериментів із графікою.; while count > 0 do
історичний розвиток Lua
age = 25
end local b = 3
</syntaxhighlight>
</syntaxhighlight>
ffi.C.printf("Hello from C printf\n") `repeat until`:
print(config.host)
vim.opt.expandtab = true
Multiple return values
local status = "active" coroutine.resume(co)
!; Вона застосовується для:
end
Практична роль: LÖVE робить Lua доступною для швидкого створення 2D-ігор і навчання game development.;</syntaxhighlight>
Коли варто використовувати Lua
} else
return obj
Індексація з 1
Одна з головних переваг Lua — просте вбудовування в C/C++ застосунки.; print(type(age))
count = count + 1
print(index, value)
Приклад:
- ігрових скриптів;
- embedded scripting;
- конфігурацій;
- plugin systems;
- automation;
- scripting у застосунках;
- Neovim-конфігурацій;
- OpenResty/Nginx логіки;
- Redis Lua scripts;
- IoT і embedded-систем;
- прототипування;
- навчання програмуванню;
- простих DSL;
- runtime-розширень.; print("Active")
Джерела
Roblox Lua
`while`: Перевага: Lua-конфігурація має змогу бути гнучкішою за JSON або INI, але простішою за повноцінну велику мову.; "!"
Coroutines
Вона застосовується для:
Lua і Python
Головна структура Lua: table замінює багато структур даних, які в інших мовах є собою окремими типами.; Приклад `__index`:
return a * b
end
<syntaxhighlight lang="lua">
== Standard library ==
* можна описувати складні структури;
* можна використовувати логіку;
* можна створювати functions;
* конфігурація залишається читабельною;
* застосунок має змогу завантажувати таблицю як інформаційні дані.; print(result)
'''Увага:''' metatables дуже потужні, але надмірна “магія” має змогу зробити Lua-код складним для читання й налагодження.; '''Головна перевага:''' Lua дуже добре підходить як легкий, швидкий і гнучкий скриптовий шар усередині більших систем.; ", " ..;</div>
Приклад словника:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
local active = true
'''LuaJIT''' — це високопродуктивна реалізація Lua з Just-In-Time compilation.; * ігрової логіки;
* взаємодії гравців;
* UI;
* внутрішніх систем;
* gameplay scripts;
* economy systems;
* events;
* multiplayer mechanics.; Приклад:
local numbers = {10, 20, 30}
if active then
== Для чого застосовується Lua ==
cache = true,
'''істотно:''' Redis Lua scripts мають бути короткими й обережними, бо вони виконуються всередині Redis і можуть впливати на продуктивність.;== Closures ==
return "Hello, " ..; role = "user"
end
</div>
</div>
<syntaxhighlight lang="lua">
== Синтаксис ==
істотно: Lua найсильніша не як “мова для всього”, а як компактна вбудована мова для конкретної системи.;</syntaxhighlight>
Error handling
Практична роль: цикли Lua прості й зручні для обробки таблиць, сценаріїв і повторюваної логіки.;=== Безпечний виклик через pcall ===
print(numbers [1]) print("Hello, world!")
Lua-скрипти можуть працювати з конфігураціями, токенами, користувацькими даними або внутрішніми API.;OpenResty і Nginx Lua
LuaJIT відома:
print(user.name) Lua не має класів у класичному сенсі, але надає можливість будувати object-like structures через tables і metatables.; `for`: print(numbers [2])
print("Step 1")
print(message) Критично: Lua як embedded scripting language повинна отримувати лише ті функціональні можливості, які host application явно надає можливість.; Критерій
<syntaxhighlight lang="lua">
local ok, err = pcall(risky)
'''Практична роль:''' Lua стала основною мовою сучасної конфігурації Neovim.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
local name = "Alice"
end
Приклад:
Приклад:
local function risky()
print("Step 2")
Умовна конструкція:
if b == 0 then
</div>
== Вбудовування Lua в C/C++ ==
local user = {
if status == "new" then
print("New")
elseif status == "active" then
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
cache = true,
local result, err = divide(10, 2)
local file = io.open("data.txt", "r")
host = "localhost",
== Boolean ==
Lua часто використовують як мову конфігурації.; Для масивів частіше використовують `ipairs`, для словників — `pairs`.;== Конфігурації на Lua ==
'''Основна ідея:''' Lua — це невелика й гнучка мова, яку без зайвих зусиль вбудувати в більшу систему, щоб користувачі або розробники могли писати сценарії, правила, конфігурації й плагіни.; → Lua script controls configurable behavior
user:greet()
Lua сама по собі компактна, але ризики залежать від того, де й як вона виконується.;<syntaxhighlight lang="lua">
== Neovim Lua ==
Приклад читання:
'''Головна думка:''' Lua — це мова для легкого скриптингу й вбудовування.; У Lua є собою різниця між `.` і `:`.;
</syntaxhighlight>
Потрібно контролювати:
Приклад `pcall`: if not ok then
print(items [1]) -- a
if err then У Lua змінні можуть бути глобальними або локальними.;== Iteration == Висновок: Python кращий як універсальна мова з великою екосистемою, а Lua — як легкий embedded scripting layer.; LÖVE або Love2D — фреймворк для створення 2D-ігор на Lua.; coroutine.resume(co)
setmetatable(obj, self)
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
local multiply = function(a, b)
Виклик через крапку:
local active = true
'''FFI''' у LuaJIT надає можливість викликати C-функції напряму з Lua-коду.; local user = { name = "Alice", age = 25 }
print(math.sqrt(16))
</div>
return function()
</div>
|-
| ключовий фокус
| Embedded scripting, ігри, конфігурації, plugins
| Універсальна мова: web, data science, automation, AI
|-
| Runtime
| Дуже компактний
| Більший і потужніший
|-
| програмний пакет
| Менша, але зручна для embedded
| Дуже велика
|-
| Вбудовування
| Дуже сильна сторона
| Можливо, але важче
|-
| Data science / AI
| Не основна ніша
| Дуже сильна програмний пакет
|}
if file then
Об’єктно-орієнтований стиль
end
`pairs` для всіх key-value пар:
Lua дуже популярна в ігровій індустрії.;== Типові помилки початківців ==
LÖVE
Lua — це легка, швидка й гнучка скриптова мова програмування, яка особливо добре підходить для вбудовування в інші застосунки, ігрових сценаріїв, конфігурацій, плагінів, автоматизації, Neovim, OpenResty, Redis scripts і runtime-розширень.; file:close()
local obj = {
end print(math_utils.add(2, 3))
Небезпека: найчастіші помилки Lua пов’язані не зі складним синтаксисом, а з глобальними змінними, nil, metatables і небезпечним виконанням сторонніх скриптів.;Приклад:
end
'''Правило:''' Lua-скрипт має бачити лише той мінімум даних і функцій, який потрібен для конкретної задачі.; err)
ffi.cdef [[
int printf(const char *fmt, ...);
]]
file:write("Hello from Lua\n")
end
* забути `local`;
* очікувати індексацію з 0;
* плутати `.` і `:`;
* не перевіряти `nil`;
* неправильне використання `pairs` і `ipairs`;
* випадково створити глобальну змінну;
* зловживати metatables;
* писати занадто великі scripts без modules;
* не обмежувати sandbox;
* припускати, що `0` є собою false;
* не враховувати різницю між Lua 5.1, 5.2, 5.3, 5.4 і LuaJIT;
* запускати сторонній код без обмежень.; Запуск:
LÖVE підходить для:
* доступ до відсутніх полів;
* арифметичні операції;
* порівняння;
* виклик як функції;
* рядкове представлення;
* прототипне наслідування;
* object-like behavior.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
<syntaxhighlight lang="lua">
return M
Lua має функції `error`, `pcall` і `xpcall`.;</div>
== переважні аспекти Lua ==
active = true
}
print("Unknown")
local counter = make_counter()
Таблиця має змогу працювати як:
Lua і JavaScript обидві є собою динамічними мовами, але мають різні ніші.; }
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
local Counter = {} !; Водночас Lua має обмеження: динамічна типізація, випадкові глобальні змінні, невелика стандартна бібліотека, різні версії runtime і потреба в sandbox для сторонніх скриптів.; Типові сценарії використання Lua:
file:close()
print("Error: " ..; Приклад:
Практична роль: Lua надає можливість створювати об’єктний стиль без жорсткої вбудованої класової системи.; * Lua Reference Manual.; print(sum)
- менша програмний пакет, ніж у Python або JavaScript;
- динамічна типізація;
- випадкові глобальні змінні;
- індексація з 1 має змогу бути незвичною;
- стандартна бібліотека невелика;
- object-oriented стиль не є собою вбудованим класично;
- metatables можуть ускладнювати код;
- різні версії Lua мають несумісності;
- LuaJIT не завжди відповідає новішим версіям Lua;
- для великих застосунків потрібна дисципліна структури.; * високою швидкістю;
- FFI;
- використанням у OpenResty;
- популярністю в продуктивних runtime-сценаріях;
- близькістю до Lua 5.1 із розширеннями.; local function make_counter()
У Lua масиви зазвичай індексуються з 1, а не з 0.; Вона найкраще функціонує тоді, коли основна платформа надає API, а Lua описує змінну логіку, правила, конфігурації або плагіни.; Python
Перевірка типу:
local message = first ..; self.value = self.value + 1
Приклади задач на Lua
Lua-модулі зазвичай реалізуються через таблиці.; Приклад масиву: !; }
Lua має кілька типів циклів.; second ..;end
* використовувати `local`;
* не забруднювати глобальний простір;
* структурувати код через modules;
* не зловживати metatables;
* явно обробляти `nil`;
* відрізняти `pairs` і `ipairs`;
* обмежувати доступи для sandbox;
* не відкривати небезпечні API користувацьким скриптам;
* писати маленькі функції;
* документувати host API;
* перевіряти помилки через `pcall` або return values;
* контролювати версію Lua;
* тестувати сценарії в з цієї причини runtime, де вони виконуються.;
local count = 10
print(user)
'''Практична роль:''' у Lua помилки можна або повертати як значення, або ловити через `pcall`.; * налаштувань редактора;
* key mappings;
* plugins;
* LSP-конфігурацій;
* themes;
* automation;
* editor scripting;
* plugin development.; Lua
<syntaxhighlight lang="lua">
`:` автономно передає `self`.; '''істотно:''' `ipairs` і `pairs` мають різну поведінку.; Lua
Не варто без потреби відкривати Lua-скриптам:
love.graphics.print("Hello, LÖVE!", 100, 100)
Приклад:
<syntaxhighlight lang="lua">
'''Перевага LuaJIT:''' у багатьох сценаріях LuaJIT робить Lua дуже швидкою скриптовою мовою.; * LuaRocks documentation.; '''Практична користь:''' closures корисні для callbacks, стану, фабрик функцій і простих об’єктних патернів.; name
else
</div>
</div>
Основні типи Lua:
until count == 3
end
print(string.upper(text))
'''Table''' — головна структура даних у Lua.; Для ширших можливостей часто потрібні зовнішні бібліотеки або API системи, в яку Lua вбудована.; '''Головне правило:''' хороший Lua-код має бути локальним, простим, модульним і без зайвої магії.; age = 25,
end
metrics = false
count = count - 1
Приклад:
Суть metatables: вони дозволяють будувати об’єктні, прототипні й DSL-подібні механізми поверх звичайних таблиць.; Lua застосовується в різних ігрових рушіях, інструментах і платформах.; local second = "Lua" local User = {}
Metamethods
FFI
З часом Lua стала популярною завдяки наявності: local counter = Counter:new() local function risky()
name = "Alice"
Приклад: Можливі проблеми:
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
Metatables дозволяють налаштовувати:
<syntaxhighlight lang="lua">
print("Age: " ..; * Документація host applications, які вбудовують Lua.; * великих backend-платформ;
* data science;
* machine learning;
* enterprise web development;
* застосунків, де потрібна сильна статична типізація;
* великих команд без Lua-досвіду;
* складних бізнес-систем із великою екосистемною потребою;
* сценаріїв, де Python, JavaScript, Go або Java мають кращі бібліотеки.;<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
local user = {
print("0 is true in Lua")
<syntaxhighlight lang="lua">
== Робота з файлами ==
Lua часто порівнюють із Python.; * LuaJIT documentation.; metrics = false
local file = io.open("output.txt", "w") !; }) if value == nil then Практична роль: multiple return values часто використовують для повернення результату й помилки без exceptions.; Практична порада: Lua варто обирати, коли головна потреба — дати системі простий і безпечний скриптовий шар.; function M.add(a, b)
Помилка: використовувати Lua як заміну великій general-purpose платформі там, де потрібна широка програмний пакет, типізація, framework-и й production tooling.; age)
Lua добре підходить, коли потрібні:
* `nil`;
* `boolean`;
* `number`;
* `string`;
* `function`;
* `table`;
* `thread`;
* `userdata`.; У Lua краще використовувати `local`, щоб уникати випадкових глобальних змінних.; print("Error: " ..; end
Приклад:
== LuaJIT ==
`pcall` викликає функцію в protected mode і повертає статус.; |-
| Основна ніша
| Embedded scripting, games, configs
| Browser, Node.js, web ecosystem
|-
| Runtime
| Дуже компактний
| Залежить від engine
|-
| Tables / Objects
| Tables як універсальна структура
| Objects, arrays, maps
|-
| Web
| Не browser-native
| Основна мова браузера
|-
| Вбудовування
| Дуже зручне
| Можливе через engines, але складніше
|}
Стандартна бібліотека Lua невелика, але містить базові функціональні можливості.; setmetatable(user, {
</div>
return M
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
<syntaxhighlight lang="lua">
end
* простому синтаксису;
* малому runtime;
* зручному C API;
* швидкій інтеграції;
* гнучким таблицям;
* metatables;
* coroutines;
* використанню в іграх;
* LuaJIT;
* стабільності й переносимості.; function User:new(name)
end Приклад:
local user = {
- cooperative multitasking;
- game loops;
- async-like logic;
- iterators;
- state machines;
- scripting workflows;
- контролю виконання сценаріїв.;=== Обробка списку ===
local ffi = require("ffi")
return a + b
Рекомендовано:
local text = "hello"
→ initializes Lua state
local co = coroutine.create(function()
print(a - b)
print(add(2, 3))
local ok, result = pcall(risky)
print(i)
print(a % b)
Lua часто застосовується разом із C.;
Безпека Lua
function User:greet()
Увага: Roblox використовує Luau, який походить від Lua, але має власні особливості, типізацію й API платформи.; Її головні сильні сторони — простота, компактність, tables, functions, closures, metatables, coroutines, LuaJIT і зручна інтеграційні функціональні можливості з C/C++.;== Умови ==
print(content)
- масив;
- словник;
- об’єкт;
- namespace;
- record;
- set;
- module;
- configuration object.; local math_utils = require("math_utils")
</syntaxhighlight> Суть функцій у Lua: функції можна зберігати в змінних, передавати як аргументи й повертати з інших функцій.; count = 10
vim.opt.number = true print(user.name) Приклад запису: print(type(name)) У таблицях присвоєння `nil` ключу фактично видаляє цей ключ:
local price = 19.99
</syntaxhighlight> </syntaxhighlight> Lua підтримує роботу closures — функції, які запам’ятовують змінні з зовнішньої області.; local name = "Alice"
</syntaxhighlight> Lua має обмеження.; Neovim активно використовує Lua для конфігурації й плагінів.;</syntaxhighlight>