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

Lua

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

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")
Увага: стандартна бібліотека Lua компактна.; Число `0` і порожній рядок `""` вважаються true-like.;

Джерела

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>

; local a = 10

Простий компонент

print(counter())