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 8Zwróć 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 2Te 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.
Wyzwanie
ŁatwyNapisz 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
xiyustawionymi na podane współrzędne - Utwórz metatabelę z
__mul, która obsługuje mnożenie wektora przez skalar - Funkcja
__mulpowinna sprawdzać, który operand jest liczbą, a który tabelą - Zwróć nową tabelę z
x = vec.x * scalariy = 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 wektoray(liczba): współrzędna y wektorascalar(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
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