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