Menu
Coddy logo textTech

Metamეტody arytmetyczne — część 2

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

Opierając się na dodawaniu i odejmowaniu, możesz także zdefiniować zachowanie mnożenia i dzielenia dla swoich tabel za pomocą metametod __mul i __div. Działają one tak samo jak __add i __sub, ale reagują na operatory * i /.

Metametoda __mul jest szczególnie przydatna, gdy chcesz przeskalować wartości w tabeli. Na przykład mnożenie wektora przez liczbę (nazywaną skalarem) powinno pomnożyć każdą składową:

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

Zwróć uwagę, jak funkcja sprawdza, który operand jest liczbą, a który tablicą. Dzięki temu zarówno vector * 2, jak i 2 * vector działają poprawnie.

Metametoda __div działa podobnie w przypadku dzielenia:

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

Te metametody uzupełniają podstawowe operacje arytmetyczne dla własnych typów, dając Ci pełną kontrolę nad działaniem operatorów matematycznych w przypadku tabel.

challenge icon

Wyzwanie

Łatwy

Napisz funkcję scaleVector, która przyjmuje x, y i scalar oraz zwraca przeskalowany wektor jako sformatowany ciąg znaków.

Utwórz tabelę wektora z podanymi współrzędnymi, dołącz metatabelę z metametodą __mul, aby umożliwić mnożenie przez skalar, pomnóż wektor przez skalar za pomocą operatora * i zwróć wynik.

Logika:

  • Utwórz tabelę wektora z kluczami x i y ustawionymi na podane współrzędne
  • Utwórz metatabelę z __mul, która obsługuje mnożenie wektora przez skalar
  • Funkcja __mul powinna sprawdzać, który operand jest liczbą, a który tabelą
  • Zwróć nową tabelę z x = vec.x * scalar i y = vec.y * scalar
  • Dołącz metatabelę do tabeli wektora za pomocą setmetatable()
  • Pomnóż wektor przez skalar za pomocą vector * scalar
  • Zwróć wynik jako ciąg znaków w formacie "x y" (wartości x i y oddzielone spacją)

Parametry:

  • x (liczba): współrzędna x wektora
  • y (liczba): współrzędna y wektora
  • scalar (liczba): wartość skalarna, przez którą należy pomnożyć wektor

Zwraca: Przeskalowany wektor jako ciąg znaków w formacie "x y" (ciąg znaków)

Spróbuj swoich sił

function scaleVector(x, y, scalar)
    -- Napisz tutaj kod
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