Menu
Coddy logo textTech

Arithmetische Metamethoden Teil 1

Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 21 von 54.

Du hast gelernt, wie du anpassen kannst, was passiert, wenn du eine Tabelle mit __tostring ausgibst. Jetzt wirst du entdecken, dass Metatabellen auch definieren können, was passiert, wenn du arithmetische Operatoren wie + und - auf deine Tabellen anwendest.

Normalerweise gibt Lua eine Fehlermeldung aus, wenn Sie versuchen, zwei Tabellen mit dem +-Operator zu addieren, da Lua nicht weiß, wie Tabellen addiert werden. Aber mit arithmetischen Metamethoden können Sie genau definieren, was Addition für Ihre benutzerdefinierten Datentypen bedeutet.

Die Metamethode __add steuert das Additionsverhalten. Wenn Lua auf den Operator + zwischen zwei Werten stößt und mindestens einer davon eine Metatabelle mit __add besitzt, ruft es diese Funktion auf, anstatt einen Fehler zu erzeugen:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Ausgabe: 4  6

Die __add-Funktion erhält zwei Argumente: den linken Operanden und den rechten Operanden. In diesem Beispiel erstellt sie eine neue Tabelle mit x- und y-Werten, die die Summe der entsprechenden Werte aus beiden Eingabetabellen sind.

Ähnlich steuert die __sub Metamethode die Subtraktion mit dem - Operator:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Ausgabe: 2  2

Diese Fähigkeit, benutzerdefiniertes Operatorverhalten zu definieren, wird als Operatorüberladung bezeichnet.

challenge icon

Aufgabe

Einfach

Schreiben Sie eine Funktion addVectors, die x1, y1, x2 und y2 entgegennimmt und das Ergebnis der Addition zweier Vektoren zurückgibt.

Erstellen Sie zwei Vektortabellen mit den gegebenen Koordinaten, hängen Sie eine Metatabelle mit der __add-Metamethode an, um die Vektoraddition zu ermöglichen, addieren Sie diese mit dem +-Operator und geben Sie das Ergebnis als formatierten String zurück.

Logik:

  • Erstellen Sie die erste Vektortabelle mit den Schlüsseln x = x1 und y = y1
  • Erstellen Sie die zweite Vektortabelle mit den Schlüsseln x = x2 und y = y2
  • Erstellen Sie eine Metatabelle mit __add, die zwei Vektoren entgegennimmt und eine neue Tabelle mit x = a.x + b.x und y = a.y + b.y zurückgibt
  • Hängen Sie die Metatabelle mit setmetatable() an beide Vektortabellen an
  • Addieren Sie die beiden Vektoren mit v1 + v2
  • Geben Sie das Ergebnis als String im Format "x y" zurück (die x- und y-Werte getrennt durch ein Leerzeichen)

Parameter:

  • x1 (number): Die x-Koordinate des ersten Vektors
  • y1 (number): Die y-Koordinate des ersten Vektors
  • x2 (number): Die x-Koordinate des zweiten Vektors
  • y2 (number): Die y-Koordinate des zweiten Vektors

Rückgabewert: Die Summe der beiden Vektoren als String im Format "x y" (string)

Spickzettel

Metatabellen können definieren, was passiert, wenn Sie arithmetische Operatoren wie + und - auf Tabellen anwenden. Dies wird als Operator-Überladung bezeichnet.

Die Metamethode __add steuert das Additionsverhalten mit dem +-Operator:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Output: 4  6

Die Funktion __add erhält zwei Argumente: den linken Operanden und den rechten Operanden.

Die Metamethode __sub steuert die Subtraktion mit dem --Operator:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Output: 2  2

Probier es selbst

function addVectors(x1, y1, x2, y2)
    -- Code hier schreiben
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow