Metametoda __tostring
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 20 z 54.
Gdy wypisujesz tablicę w Lua, zazwyczaj widzisz coś mało przydatnego, na przykład table: 0x5f8a20 — tylko adres pamięci. Metametoda __tostring pozwala zmienić to zachowanie przez określenie, co dokładnie ma być wyświetlane, gdy tablica zostanie przekonwertowana na ciąg znaków.
Ten metametod jest szczególnie przydatny podczas debugowania i tworzenia bardziej przejrzystych danych wyjściowych. Gdy Lua musi przekonwertować twoją tablicę na ciąg znaków (na przykład podczas używania print()), sprawdza, czy tablica ma metatabelę z polem __tostring. Jeśli tak, Lua wywołuje tę funkcję i używa wartości, którą zwraca, zamiast domyślnej reprezentacji.
Oto jak to zaimplementować:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Wynik: Vector(3, 4)Funkcja __tostring otrzymuje tabelę jako argument i musi zwrócić ciąg znaków. W tym przykładzie tworzy sformatowany ciąg znaków, który przedstawia wartości x i y wektora w czytelny sposób.
Dzięki temu praca z kodem jest znacznie łatwiejsza. Zamiast widzieć podczas debugowania tajemnicze adresy pamięci, otrzymujesz przydatne informacje o zawartości tablicy.
Wyzwanie
ŁatwyNapisz funkcję createPoint, która przyjmuje współrzędne x i y i zwraca tabelę punktu z niestandardową reprezentacją tekstową.
Utwórz tabelę z polami x i y, dołącz metatabelę z metametodą __tostring i zwróć wynik konwersji tabeli na ciąg znaków za pomocą tostring().
Logika:
- Utwórz tabelę z kluczami
xiyustawionymi na podane współrzędne - Utwórz metatabelę z
__tostring, która zwraca ciąg znaków w formacie"Point(x, y)" - Dołącz metatabelę do tabeli punktu za pomocą
setmetatable() - Zwróć
tostring(point), aby uzyskać niestandardową reprezentację tekstową
Parametry:
x(liczba): współrzędna x punktuy(liczba): współrzędna y punktu
Zwraca: niestandardową reprezentację tekstową punktu w formacie "Point(x, y)" (ciąg znaków)
Spróbuj swoich sił
function createPoint(x, y)
-- Wpisz 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 postaci2Wię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