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 6Die __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 2Diese Fähigkeit, benutzerdefiniertes Operatorverhalten zu definieren, wird als Operatorüberladung bezeichnet.
Aufgabe
EinfachSchreiben 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 = x1undy = y1 - Erstellen Sie die zweite Vektortabelle mit den Schlüsseln
x = x2undy = y2 - Erstellen Sie eine Metatabelle mit
__add, die zwei Vektoren entgegennimmt und eine neue Tabelle mitx = a.x + b.xundy = a.y + b.yzurü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 Vektorsy1(number): Die y-Koordinate des ersten Vektorsx2(number): Die x-Koordinate des zweiten Vektorsy2(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 6Die 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 2Probier es selbst
function addVectors(x1, y1, x2, y2)
-- Code hier schreiben
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittene Table-Iteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle