Wenn du nach Python oder JS zu Lua kommst und erfährst, dass es hier keine Arrays, keine Objekte, keine Wörterbücher gibt... Und es gibt nur Tabellen.
Dein Gesicht: 😐
Mein Gesicht eine Woche später, als ich die Macht der Tabellen erkannte: 🤯
Lassen Sie uns herausfinden, warum Tabellen in Lua keine „Spracharmut“ sind, sondern ein geniales Design, das Neulinge hartnäckig unterschätzen.

Warten Sie, sind das wirklich nur Tabellen?
Ja. Eine Datenstruktur für alle Fälle. Möchten Sie ein Array? Tabelle. Wörterbuch? Tabelle. Objekt mit Methoden? Richtig geraten - Tabelle. Warteschlange, Stack, Graph, Baum? Alles Tabellen.
Lua-Entwickler, der die Projektarchitektur erklärt:
- Und hier haben wir eine Tabelle von Tabellen, die Tabellen mit Tabellen speichert.
— Verstanden, danke.
Klingt verrückt, ist aber in der Praxis unglaublich elegant.
Tabelle als Array: Indexierung ab eins (ja, ab EINS)
Hier ist der erste Schock für jeden, der aus der Welt der normalen Sprachen kommt:
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- "apple"
print(fruits[0]) -- nil 😭Indexierung mit 1. Nicht von Null. Mit EINHEIT.
Jeder ehemalige C-Programmierer fühlt in diesem Moment körperliche Schmerzen. Aber Lua hat seine Gründe - die Sprache wurde für Menschen entwickelt, die weit von der Programmierung entfernt sind (Ingenieure, Designer), und für sie ist "das erste Element = 1" logisch.
Man gewöhnt sich in ein paar Tagen daran. Du leidest - die ersten zwei Stunden.
Nützliche Klassiker: Array-Iteration
local heroes = {"Lua", "Python", "JavaScript"}
for i, name in ipairs(heroes) do
print(i .. ". " .. name)
end
-- 1. Lua
-- 2. Python
-- 3. JavaScriptipairs - durchläuft die numerischen Indizes in der richtigen Reihenfolge. Merken Sie sich das, es wird überall sein.
Tabelle als Wörterbuch: Schlüsselwert auf Steroiden
Hier beginnt die Magie. Eine Tabelle kann sowohl ein Array als auch ein Wörterbuch sein:
local player = {
name = "ProGamer228",
level = 42,
hp = 100,
"hidden achievement" -- это индекс [1]
}
print(player.name) -- "ProGamer228"
print(player["level"]) -- 42
print(player[1]) -- "hidden achievement"Zwei Zugriffsformen: über einen Punkt (player.name) und über Klammern (player["name"]). Klammern werden benötigt, wenn der Schlüssel eine Variable ist oder Sonderzeichen enthält.
local key = "hp"
print(player[key]) -- 100
-- Ключом может быть вообще что угодно
local weird = {}
weird[true] = "yes"
weird[3.14] = "pi"
weird[print] = "function as a key, why not"Der Schlüssel kann ein beliebiger Typ sein, außer nil. Dies eröffnet wahnsinnige Möglichkeiten, aber man sollte es nicht übertreiben - die Lesbarkeit des Codes ist auch wichtig.
Tabellenlänge: Hier ist alles kompliziert
Der Operator # gibt die Länge des "Array"-Teils der Tabelle zurück:
local t = {10, 20, 30, 40}
print(#t) -- 4 ✅
local mixed = {10, 20, nil, 40}
print(# gemischt) -- kann 2 sein, kann 4 sein 🤡Wichtige Regel: Wenn der massive Teil nil enthält, ist das Verhalten von # nicht definiert. Lua kann eine beliebige Zahl zurückgeben. Dies ist kein Fehler, es ist beabsichtigt. Lass einfach keine Löcher in den Arrays.
Möchten Sie eine zuverlässige Länge für Wörterbücher? Zählen Sie manuell:
local function tableLength(t)
local count = 0
for _ in pairs(t) do
count = count + 1
end
return count
endTabelle als Objekt: OOP auf Lua-Art
In Lua gibt es keine Klassen. Aber wen hat das jemals aufgehalten?
local Dog = {}
Dog.__index = Dog
function Dog.new(name, breed)
local self = setmetatable({}, Dog)
self.name = name
self.breed = breed
return self
end
function Dog:bark()
print(self.name .. " says: WOOF!")
end
function Dog:info()
print(self.name .. " - breed: " .. self.breed)
end
local rex = Dog.new("Rex", "Shepherd")
rex:bark() -- Рекс говорит: ГАВ!
rex:info() -- Рекс — порода: ОвчаркаAchten Sie beim Aufruf der Methode auf den Doppelpunkt (:) anstelle des Punkts. Dies ist ein Syntaxzucker, der das Objekt automatisch als self überträgt. Ohne das müsste man rex.bark(rex) schreiben, und das würde traurig aussehen.
Vererbung? Auch über Tabellen
local Puppy = setmetatable({}, {__index = Dog})
Puppy.__index = Puppy
function Puppy.new(name, breed, toy)
local self = Dog.new(name, breed)
setmetatable(self, Puppy)
self.toy = toy
return self
end
function Puppy:play()
print(self.name .. " plays with " .. self.toy .. "!")
end
local baby = Puppy.new("Bobik", "Corgi", "ball")
baby:bark() -- Бобик говорит: ГАВ! (унаследовано от Dog)
baby:play() -- Бобик играет с мячиком!Metatabellen und __index sind das Herzstück des Lua-Objektsystems. Wenn das Feld in der aktuellen Tabelle nicht gefunden wird, schaut Lua in die __index Metatabelle. Die Kette kann beliebig lang sein - hier ist die Vererbung.

Metamethoden: Wir überladen alles
Metatabellen ermöglichen es Ihnen, das Verhalten einer Tabelle für Standardoperationen zu überschreiben:
local Vector = {}
Vector.__index = Vector
function Vector.new(x, y)
return setmetatable({x = x, y = y}, Vector)
end
-- Перегружаем оператор сложения
function Vector.__add(a, b)
return Vector.new(a.x + b.x, a.y + b.y)
end
-- Перегружаем вывод через tostring
function Vector.__tostring(v)
return "(" .. v.x .. ", " .. v.y .. ")"
end
local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
local v3 = v1 + v2
print(tostring(v3)) -- (4, 6)Die wichtigsten Metamethoden, die man kennen sollte:
__add,__sub,__mul,__div— Arithmetik__eq,__lt,__le— Vergleich__tostring— Zeichenfolgendarstellung__index— Zugriff auf ein nicht vorhandenes Feld__newindex— Eintrag eines neuen Feldes__call— Aufruf einer Tabelle als Funktion__len- Überschreiben des Operators#
Mit __call kann eine Tabelle aufgerufen werden - und dies wird tatsächlich in der Produktion verwendet:
local Logger = setmetatable({}, {
__call = function(self, message)
print("[LOG] " .. os.date("%H:%M:%S") .. " — " .. message)
end
})
Logger("Server is running") -- [LOG] 14:32:01 — Сервер запущенPraktische Muster: Tabellen im echten Code
Konfiguration über Tabelle
local config = {
server = {
host = "localhost",
port = 8080,
},
database = {
name = "myapp",
user = "admin",
password = "hunter2", -- классика
},
debug = true,
}
print(config.server.port) -- 8080Menge (Set)
local function Set(list)
local set = {}
for _, v in ipairs(list) do
set[v] = true
end
return set
end
local langs = Set{"Lua", "Python", "JavaScript", "Lua"}
if langs["Lua"] then
print("Lua in action!") -- Lua в деле!
end
if not langs["COBOL"] then
print("COBOL? No, we haven't heard of it")
endWarteschlange
local Queue = {}
Queue.__index = Queue
function Queue.new()
return setmetatable({first = 1, last = 0}, Queue)
end
function Queue:push(value)
self.last = self.last + 1
self[self.last] = value
end
function Queue:pop()
if self.first > self.last then return nil end
local value = self[self.first]
self[self.first] = nil
self.first = self.first + 1
return value
end
local q = Queue.new()
q:push("first")
q:push("second")
print(q:pop()) -- "first"
print(q:pop()) -- "second"Die häufigsten Anfängerfehler mit Tabellen
1. Vergessen, dass Tabellen per Link übertragen werden
local a = {1, 2, 3}
local b = a -- b указывает на ту же таблицу!
b[1] = 999
print(a[1]) -- 999 (сюрприз!)Möchtest du eine Kopie? Manuell erstellen:
local function shallowCopy(t)
local copy = {}
for k, v in pairs(t) do
copy[k] = v
end
return copy
end2. Verwechseln Sie Paare und Ipaire
ipairs- nur numerische Schlüssel, in der Reihenfolge, stoppt beim erstennilpairs— alle Schlüssel, Reihenfolge nicht garantiert
3. Ändern Sie die Tabelle während der Iteration
Tu das nicht. Tu es einfach nicht. Sammle die Änderungen in einer separaten Tabelle und wende sie dann an.
4. # als zuverlässig für Tabellen mit Löchern betrachten
Wir haben es bereits gesagt, aber wir wiederholen es: nil in der Mitte des Arrays = unvorhersehbare Länge. Keine Optionen.
Lerne Lua und andere Sprachen mit Kodik!
Wenn Sie bis hierher gelesen haben, interessieren Sie sich offensichtlich nicht nur für die Theorie, sondern auch für die Praxis. Tabellen in Lua werden am besten gelernt, wenn Sie Code von Hand schreiben und nicht nur Artikel lesen.
Kodik - ist eine Anwendung, in der Sie Programmieren von Grund auf neu lernen und Ihre Fähigkeiten durch praktische Aufgaben verbessern können. Python, JavaScript, HTML, CSS und andere Technologien - alles mit dem Schwerpunkt, dass Sie tatsächlich Code schreiben und nicht nur darauf schauen.
Und wir haben auch Telegram-Kanal mit einer Community von über 2000 Entwicklern, in der regelmäßig nützliche Beiträge, Aufgabenanalysen und Programmiermeme veröffentlicht werden (ohne sie geht es nirgendwo hin). Eine großartige Möglichkeit, das Material an einem geeigneten Ort zu wiederholen – in der Schlange, im Transport, beim Mittagessen. Abonnieren und jeden Tag verbessern.
Fazit: Warum sind Tabellen genial?
Tabellen in Lua sind wie ein Schweizer Taschenmesser, das zunächst seltsam erscheint, aber dann versteht man nicht, wie man ohne es gelebt hat. Eine Datenstruktur anstelle von zehn, minimale Syntax, maximale Flexibilität.
Was Sie sich merken sollten:
Tabellen ersetzen Arrays, Wörterbücher, Objekte, Klassen und alles andere
Indexierung mit 1 - kein Bug, sondern ein Feature (akzeptiere es einfach)
Metatabellen verwandeln Tabellen in ein vollwertiges Objektsystem
Tabellen werden per Link übertragen — Vorsicht beim Kopieren
#funktioniert nur bei Arrays ohne Löcher zuverlässig
Lua ist eine Sprache, die beweist: Weniger ist mehr. Und Tabellen sind das beste Beispiel für diese Philosophie.
Jetzt geh und schreib etwas in Lua. Die Tabellen warten. 🚀
