Перейти до вмісту

Lua

Матеріал з K2 ERP Wiki

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)

  • використовувати `local`;
  • не забруднювати глобальний простір;
  • структурувати код через modules;
  • не зловживати metatables;
  • явно опрацьовувати `nil`;
  • відрізняти `pairs` і `ipairs`;
  • обмежувати доступи для sandbox;
  • не відкривати небезпечні API користувацьким скриптам;
  • писати маленькі функції;
  • документувати host API;
  • перевіряти помилки через `pcall` або return values;
  • контролювати версію Lua;
  • тестувати сценарії в тому runtime, де вони виконуються.</syntaxhighlight>
__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 values

vim.opt.number = true

Coroutines

Приклад масиву:

Tables

  • файлову систему;
  • мережу;
  • `os.execute`;
  • debug library;
  • доступ до глобальних змінних;
  • небезпечні API;
  • час виконання;
  • пам’ять;
  • зовнішні модулі. Критерій

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++

У сучасних версіях Lua можуть відрізнятися integer і float-представлення, але для багатьох скриптових задач це приховано від користувача.
 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 Перевірка типу: Приклад:

  • 2D-ігор;
  • прототипів;
  • навчання;
  • game jams;
  • small indie games;
  • експериментів із графікою. 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

Перша програма на Lua

age = 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>

Roblox Lua