Menu
Coddy logo textTech

Arithmetische Metamethoden Teil 2

Teil des Abschnitts Logik & Programmablauf 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  8

Beachten 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  2

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

challenge icon

Aufgabe

Einfach

Schreiben 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 x und y auf 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 * scalar und y = vec.y * scalar zurü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 Vektors
  • y (number): Die y-Koordinate des Vektors
  • scalar (number): Der Skalarwert, mit dem der Vektor multipliziert werden soll

Rückgabewert: Der skalierte Vektor als String im Format "x y" (string)

Probier es selbst

function scaleVector(x, y, scalar)
    -- 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 Logik & Programmablauf