Menu
Coddy logo textTech

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

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  8

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

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 Logic & Flow