{}const=>[]async()letfn</>var
EntwicklungLua

Tabellen in Lua: Die mächtigste Struktur, die von Anfängern unterschätzt wird

Wir verstehen, warum Tabellen - die einzige Datenstruktur in Lua - keine Einschränkung, sondern eine Supermacht sind. Arrays, Wörterbücher, Objekte, Klassen und sogar Warteschlangen sind alles Tabellen. Mit Codebeispielen, Metatabellen, typischen Anfängerfehlern und Memen.

К

Kodik

Autor

7 Min. Lesezeit

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.

🔥 100.000+ Schüler sind bereits bei uns

Genug Theorie gelesen?
Zeit zu coden!

Kodik — eine App, in der du durch Praxis programmieren lernst. KI-Mentor, interaktive Lektionen, echte Projekte.

🤖 KI 24/7
🎓 Zertifikate
💰 Kostenlos
🚀 Jetzt starten
Heute beigetreten

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. JavaScript

ipairs - 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
end

Tabelle 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)  -- 8080

Menge (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")
end

Warteschlange

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
end

2. Verwechseln Sie Paare und Ipaire

  • ipairs - nur numerische Schlüssel, in der Reihenfolge, stoppt beim ersten nil

  • pairs — 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. 🚀

🎯Hör auf zu zögern

Artikel gefallen?
Zeit zum Üben!

Bei Kodik liest du nicht nur — du schreibst sofort Code. Theorie + Praxis = echte Skills.

Sofortige Praxis
🧠KI erklärt Code
🏆Zertifikat

Keine Registrierung • Keine Karte