Arithmetische Metamethoden Teil 2
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 22 von 54.
Aufbauend auf Addition und Subtraktion können Sie auch das Multiplikations- und Divisionsverhalten für Ihre Tabellen definieren, indem Sie die Metamethoden __mul und __div verwenden. Diese funktionieren auf die gleiche Weise wie __add und __sub, reagieren jedoch auf die Operatoren * und /.
Die __mul Metamethode ist besonders nützlich, wenn Sie die Werte einer Tabelle skalieren möchten. Zum Beispiel sollte die Multiplikation eines Vektors mit einer Zahl (einem sogenannten Skalar) jede Komponente multiplizieren:
local vector = {x = 3, y = 4}
local meta = {
__mul = function(a, b)
local scalar = type(a) == "number" and a or b
local vec = type(a) == "table" and a or b
return {x = vec.x * scalar, y = vec.y * scalar}
end
}
setmetatable(vector, meta)
local scaled = vector * 2
print(scaled.x, scaled.y) -- Ausgabe: 6 8Beachten Sie, wie die Funktion prüft, welcher Operand die Zahl und welcher die Tabelle ist. Dies ermöglicht es, dass sowohl vector * 2 als auch 2 * vector korrekt funktionieren.
Die __div-Metamethode funktioniert ähnlich für die Division:
local meta = {
__div = function(a, b)
return {x = a.x / b, y = a.y / b}
end
}
setmetatable(vector, meta)
local divided = vector / 2
print(divided.x, divided.y) -- Ausgabe: 1.5 2Diese Metamethoden vervollständigen die grundlegenden arithmetischen Operationen für Ihre benutzerdefinierten Typen und geben Ihnen die volle Kontrolle darüber, wie sich mathematische Operatoren bei Ihren Tabellen verhalten.
Aufgabe
EinfachSchreiben Sie eine Funktion scaleVector, die x, y und scalar entgegennimmt und den skalierten Vektor als formatierten String zurückgibt.
Erstellen Sie eine Vektortabelle mit den angegebenen Koordinaten, fügen Sie eine Metatabelle mit der Metamethode __mul hinzu, um die Skalarmultiplikation zu ermöglichen, multiplizieren Sie den Vektor mit dem Skalar unter Verwendung des *-Operators und geben Sie das Ergebnis zurück.
Logik:
- Erstellen Sie eine Vektortabelle, bei der die Schlüssel
xundyauf die bereitgestellten Koordinaten gesetzt sind - Erstellen Sie eine Metatabelle mit
__mul, die die Multiplikation zwischen einem Vektor und einem Skalar verarbeitet - Die
__mul-Funktion sollte prüfen, welcher Operand die Zahl und welcher die Tabelle ist - Geben Sie eine neue Tabelle mit
x = vec.x * scalarundy = vec.y * scalarzurück - Verknüpfen Sie die Metatabelle mit der Vektortabelle unter Verwendung von
setmetatable() - Multiplizieren Sie den Vektor mit dem Skalar unter Verwendung von
vector * scalar - Geben Sie das Ergebnis als String im Format
"x y"zurück (die x- und y-Werte getrennt durch ein Leerzeichen)
Parameter:
x(number): Die x-Koordinate des Vektorsy(number): Die y-Koordinate des Vektorsscalar(number): Der Skalarwert, mit dem der Vektor multipliziert werden soll
Rückgabewert: Der skalierte Vektor als String im Format "x y" (string)
Spickzettel
Die Metamethoden __mul und __div definieren das Multiplikations- und Divisionsverhalten für Tabellen und reagieren auf die Operatoren * und /.
Die Metamethode __mul ist nützlich, um Tabellenwerte zu skalieren. Wenn Sie einen Vektor mit einem Skalar multiplizieren, prüfen Sie, welcher Operand die Zahl und welcher die Tabelle ist, um sowohl vector * 2 als auch 2 * vector zu ermöglichen:
local vector = {x = 3, y = 4}
local meta = {
__mul = function(a, b)
local scalar = type(a) == "number" and a or b
local vec = type(a) == "table" and a or b
return {x = vec.x * scalar, y = vec.y * scalar}
end
}
setmetatable(vector, meta)
local scaled = vector * 2
print(scaled.x, scaled.y) -- Ausgabe: 6 8Die Metamethode __div funktioniert ähnlich für die Division:
local meta = {
__div = function(a, b)
return {x = a.x / b, y = a.y / b}
end
}
setmetatable(vector, meta)
local divided = vector / 2
print(divided.x, divided.y) -- Ausgabe: 1.5 2Probier es selbst
function scaleVector(x, y, scalar)
-- 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