Du hast Roblox, World of Warcraft, Garry's Mod gespielt oder an nginx herumgepfuscht – und hattest nicht einmal eine Ahnung, dass du die ganze Zeit LuaEs ist Zeit, sich richtig kennenzulernen.
Lua ist die Sprache, von der jeder sagt: „Ah, das ist für Spiele“, und dann stellt sich heraus, dass sie in Redis, NGINX (OpenResty), Wireshark, Neovim und vielen anderen Orten lebt, an denen eine schnelle, einfach zu integrierende Skript-Engine benötigt wird.
Der gesamte Lua-Interpreter wiegt weniger als 300 KB. Gleichzeitig gehört Lua zu den schnellsten Skriptsprachen (LuaJIT fliegt in einigen Benchmarks auf C-Niveau).

Variablen: Alles ist einfach, aber es gibt eine Nuance
Standardvariablen in Lua global. Ja, genau wie in JavaScript vor "use strict". Und ja, das ist eine Falle.
-- Это глобальная переменная. Она видна ОТОВСЮДУ.
name = "Code"
-- А вот так — локальная. Используй local ВСЕГДА.
local age = 25
local is_cool = trueRegel Nummer eins: schreibe immer local. Wenn du es vergessen hast, fließt die Variable in den globalen Sichtbereich, und dann wirst du zwei Stunden lang debuggen, warum counter an zufälligen Stellen zurückgesetzt wird.
Datentypen: Minimalismus in seiner ganzen Pracht
In Lua insgesamt 8 Arten. Acht. Zum Vergleich: In TypeScript hast du mehr Typen als Freunde auf LinkedIn.
local a = 42 -- number (и int, и float — всё number)
local b = "hello" -- string
local c = true -- boolean
local d = nil -- nil (отсутствие значения)
local e = {} -- table (массив, объект, словарь — всё в одном)
local f = print -- function (да, функции — это значения)Das Wichtigste: table ist die einzige Datenstruktur. Array? Tabelle. Objekt? Tabelle. Wörterbuch? Auch Tabelle. HashMap? Rate mal.
Tabellen: ein Typ, um alle zu regieren
Table in Lua ist ein Schweizer Messer. Siehe:
-- Как массив (индексация с 1, а не с 0!)
local fruits = {"apple", "banana", "mango"}
print(fruits[1]) -- "apple" (не fruits[0]!)
-- Как словарь
local user = {
name = "Alexey",
level = "senior",
stack = {"Vue", "Nuxt", "Lua"}
}
print(user.name) -- "Alexey"
print(user["level"]) -- "senior"
-- Как и то, и другое одновременно (но лучше так не делай)
local chaos = {
"first",
name = "Chaos",
"second",
power = 9000
}Indexierung von eins - das ist der Grund, warum Entwickler in C, Python und JS die ersten 30 Minuten mit einem steinernen Gesicht herumlaufen. Aber dann gewöhnt man sich daran. Versprochen.
Bedingungen und Zyklen: Klassiker des Genres
Keine geschweiften Klammern. Keine elif. Einfach if, elseif, then und end:
local hp = 75
if hp <= 0 then
print("Game Over")
elseif hp < 30 then
print("Critically low HP!")
else
print("Everything is fine, we live")
endAuch die Zyklen sind keine Überraschung:
-- Числовой for
for i = 1, 5 do
print("Iteration:", i)
end
-- While
local count = 0
while count < 3 do
print(count)
count = count + 1 -- Да, в Lua нет ++ и +=
end
-- Перебор таблицы
local heroes = {"Geralt", "Link", "Mario"}
for index, hero in ipairs(heroes) do
print(index .. ". " .. hero)
endSchmerzmoment: in Lua nicht +=, -=, ++. Jedes Mal, wenn du count = count + 1 wie im Jahr 2003 schreibst. Es gibt einen Vorschlag, Compound-Operatoren hinzuzufügen, aber für den Moment - akzeptiere es.
Funktionen: Bürger erster Klasse
Funktionen in Lua sind vollwertige Werte. Sie können in Variablen gespeichert, als Argumente übergeben und von anderen Funktionen zurückgegeben werden:
-- Обычная функция
local function greet(name)
return "Hi, " .. name .. "!"
end
print(greet("World")) -- "Hello, World!"
-- Функция, которая возвращает функцию (замыкание!)
local function create_counter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = create_counter()
print(counter()) -- 1
print(counter()) -- 2
print(counter()) -- 3Lua unterstützt mehrere Rückgabewerte - ohne jegliche Verpackung in Arrays oder Objekte:
local function get_user()
return "Alexey", 25, "frontend"
end
local name, age, role = get_user()
print(name) -- "Alexey"
print(role) -- "frontend"Zeilen: Verkettung durch ..
Vergiss + für Strings. In Lua ist Verkettung ..:
local first = "Hello"
local second = "World"
print(first .. " " .. second) -- "Hello World"
-- Длина строки
print(# "Kodik") -- 10 (UTF-8 Bytes, keine Zeichen!)
-- string.format — как printf, только в Lua
local msg = string.format("%s %d HP", "hero", 100)
print(msg) -- "The hero has 100 HP"Wichtig: Der Operator # gibt die Länge in Bytes, nicht in Zeichen. Für kyrillische Zeichen ist dies eine Falle - jeder Buchstabe belegt 2 Bytes in UTF-8.
OOP: Zusammenstellen aus Tabellen und Metatabellen
Lua hat keine Klassen aus der Box. Aber es gibt Metatabellen - ein Mechanismus, durch den Vererbung, Operatorüberladung und im Allgemeinen jedes Objektmodell implementiert werden können:
-- "Class" через таблицу
local Player = {}
Player.__index = Player
function Player.new(name, hp)
local self = setmetatable({}, Player)
self.name = name
self.hp = hp
return self
end
function Player:take_damage(amount)
self.hp = self.hp - amount
if self.hp <= 0 then
print(self.name .. " defeated!")
else
print(self.name .. ": remaining " .. self.hp .. " HP")
end
end
-- Использование
local hero = Player.new("Geralt", 100)
hero:take_damage(30) -- "Geralt: 70 HP left"
hero:take_damage(80) -- "Geralt is defeated!"Achten Sie auf Doppelpunkt (:) ist ein Syntaxzucker. hero:take_damage(30) entspricht hero.take_damage(hero, 30). Der Doppelpunkt überträgt automatisch self.
Chips, die überraschen
Mehrfache Zuweisung:
local a, b = 10, 20
a, b = b, a -- swap без временной переменной!
print(a, b) -- 20, 10Ternarnik durch und/oder:
-- В Lua нет ternary operator, но есть хак:
local status = (hp > 0) and "alive" or "dead"Varargs - Variable Anzahl von Argumenten:
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4, 5)) -- 15Wo wird Lua gerade verwendet?
Lua ist kein Museumsstück. Es arbeitet in der Produktion bei Milliarden von Nutzern:
Roblox — Alle Spielskripte auf Luau (Lua-Fork)
Neovim — Konfigurationen und Plugins werden in Lua geschrieben, nicht in VimScript
Redis – Skripte für atomare Operationen
NGINX/OpenResty — Hochbelastete API-Gateways
World of Warcraft — Add-ons, die Millionen von Spielern schreiben
Eingebettete Systeme — IoT-Geräte, bei denen jeder Kilobyte zählt
Übung macht den Meister
Theorie ohne Praxis wird in einer Woche vergessen - das ist eine Tatsache. Wenn Sie wirklich verstehen wollen, wie man programmiert, und nicht nur einen Artikel lesen und die Registerkarte schließen möchten, versuchen Sie es Kodik.
Kodik ist eine App zum Erlernen der Programmierung mit Schwerpunkt auf Praxis. Hier liest du nicht nur Theorie - du löst Aufgaben, schreibst Code und siehst sofort das Ergebnis. Kurse in Python, JavaScript, HTML, CSS und anderen Technologien sind so aufgebaut, dass Sie in Ihrem eigenen Tempo, von Ihrem Telefon oder Computer aus lernen können.
Und wir haben auch Telegram-Community mit über 2000 Entwicklern, die regelmäßig nützliche Beiträge zum Thema Programmierung veröffentlichen. Dies ist eine großartige Möglichkeit, das Material in einem praktischen Format zu wiederholen — Sie blättern durch das Band und pumpen gleichzeitig Wissen. Abonnieren Sie uns und lernen Sie mit uns.
Insgesamt
Lua ist eine Sprache, die beweist: Man muss nicht komplex sein, um leistungsstark zu sein. 8 Datentypen, eine Datenstruktur, minimalistische Syntax — und gleichzeitig funktioniert sie in GameDev, Webservern, Datenbanken und Embedded-Systemen.
Wenn du schon einmal davon geträumt hast, einen Mod für dein Lieblingsspiel zu schreiben, ein Plugin für Neovim zu erstellen oder einfach nur eine Sprache an einem Wochenende lernen möchtest, ist Lua eine gute Wahl. Die Eintrittsbarriere ist minimal, und die Möglichkeiten sind ziemlich ernst.
print("Good luck learning Lua!")