Menu
Coddy logo textTech

Metamეტody arytmetyczne — część 1

Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 21 z 54.

Nauczysz się, jak dostosować to, co się dzieje podczas drukowania tablicy za pomocą __tostring. Teraz dowiesz się, że metatabele mogą również definiować, co się dzieje, gdy używasz operatorów arytmetycznych, takich jak + i -, na swoich tablicach.

Zwykle, jeśli spróbujesz dodać do siebie dwie tablice za pomocą operatora +, Lua zgłosi błąd, ponieważ nie wie, jak dodawać tablice. Dzięki metametodom arytmetycznym możesz jednak dokładnie określić, co oznacza dodawanie w przypadku własnych typów danych.

Metametoda __add kontroluje zachowanie operatora dodawania. Gdy Lua napotka operator + między dwiema wartościami i co najmniej jedna z nich ma metatabelę z __add, wywołuje tę funkcję zamiast zgłaszać błąd:

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)  -- Wynik: 4  6

Funkcja __add otrzymuje dwa argumenty: lewy operand i prawy operand. W tym przykładzie tworzy nową tablicę z wartościami x i y, które są sumą odpowiednich wartości z obu tablic wejściowych.

Podobnie metametoda __sub kontroluje odejmowanie za pomocą operatora -:

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)  -- Wynik: 2  2

Ta możliwość definiowania niestandardowego działania operatorów nazywa się przeciążaniem operatorów.

challenge icon

Wyzwanie

Łatwy

Napisz funkcję addVectors, która przyjmuje x1, y1, x2 i y2 oraz zwraca wynik dodania do siebie dwóch wektorów.

Utwórz dwie tablice wektorów o podanych współrzędnych, dołącz metatabelę z metametodą __add, aby umożliwić dodawanie wektorów, dodaj je za pomocą operatora + i zwróć wynik jako sformatowany ciąg znaków.

Logika:

  • Utwórz pierwszą tablicę wektora z kluczami x = x1 i y = y1
  • Utwórz drugą tablicę wektora z kluczami x = x2 i y = y2
  • Utwórz metatabelę z __add, która przyjmuje dwa wektory i zwraca nową tablicę z x = a.x + b.x i y = a.y + b.y
  • Dołącz metatabelę do obu tablic wektorów za pomocą setmetatable()
  • Dodaj oba wektory za pomocą v1 + v2
  • Zwróć wynik jako ciąg znaków w formacie "x y" (wartości x i y oddzielone spacją)

Parametry:

  • x1 (liczba): współrzędna x pierwszego wektora
  • y1 (liczba): współrzędna y pierwszego wektora
  • x2 (liczba): współrzędna x drugiego wektora
  • y2 (liczba): współrzędna y drugiego wektora

Zwraca: sumę dwóch wektorów jako ciąg znaków w formacie "x y" (ciąg znaków)

Spróbuj swoich sił

function addVectors(x1, y1, x2, y2)
    -- Napisz kod tutaj
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator Lua online