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 6Funkcja __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 2Ta możliwość definiowania niestandardowego działania operatorów nazywa się przeciążaniem operatorów.
Wyzwanie
ŁatwyNapisz 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 = x1iy = y1 - Utwórz drugą tablicę wektora z kluczami
x = x2iy = y2 - Utwórz metatabelę z
__add, która przyjmuje dwa wektory i zwraca nową tablicę zx = a.x + b.xiy = 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 wektoray1(liczba): współrzędna y pierwszego wektorax2(liczba): współrzędna x drugiego wektoray2(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
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
1Zaawansowane iterowanie po tabelach
Iterowanie za pomocą pairs()Iterowanie za pomocą ipairs()pairs() a ipairs()Powtórka — karta postaci4Wprowadzenie do metatabel
Czym jest metatabela?setmetatable i getmetatableMetametoda __indexMetametoda __newindexMetametoda __tostringMetamეტody arytmetyczne — część 1Metamეტody arytmetyczne — część 2Podsumowanie — tabela tylko do odczytu2Więcej funkcji biblioteki table
table.concat()Tworzenie tabel i unpack()table.sort()Sortowanie niestandardowe za pomocą funkcjiPodsumowanie — tablica najlepszych wyników5Projekt: silnik tekstowej gry przygodowej
Konfiguracja projektu: pokójŁączenie pokoiPoćwicz samodzielnie: Kompilator Lua online