setmetatable i getmetatable
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 17 z 54.
Teraz, gdy rozumiesz już, czym koncepcyjnie są metatabele, czas nauczyć się, jak faktycznie z nimi pracować. Lua udostępnia do tego dwie podstawowe funkcje: setmetatable(), aby przypisać metatabelę do tabeli, oraz getmetatable(), aby ją pobrać.
Aby przypisać metatabelę do tabeli, użyj setmetatable(). Ta funkcja przyjmuje dwa argumenty: tabelę, którą chcesz zmodyfikować (główną tabelę), oraz metatabelę, którą chcesz do niej przypisać:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)W tym przykładzie myMetatable jest teraz dołączona do myTable. Sama metatablica jest na razie pusta, ale ustanawia to połączenie między tymi dwiema tablicami. Funkcja setmetatable() zwraca również główną tablicę, co pozwala w razie potrzeby łączyć operacje.
Aby pobrać metatabelę przypisaną do tabeli, użyj getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Wynik: trueTa funkcja zwraca metatablicę, jeśli została przypisana, albo nil, jeśli tablica nie ma metatablicy. Jest to przydatne, gdy chcesz sprawdzić lub zmodyfikować metatablicę tablicy po jej ustawieniu.
Zrozumienie tych dwóch funkcji stanowi podstawę pracy z metatabelami w Lua. Gdy nauczysz się dołączać i pobierać metatabele, będziesz gotowy definiować metametody zmieniające zachowanie twoich tabel.
Wyzwanie
ŁatwyNapisz funkcję attachMetatable, która przyjmuje mainTable i metaTable oraz zwraca true, jeśli metatabela została pomyślnie dołączona.
Użyj setmetatable(), aby dołączyć metatabelę do głównej tabeli, a następnie sprawdź dołączenie za pomocą getmetatable().
Logika:
- Dołącz
metaTabledomainTableza pomocąsetmetatable() - Pobierz dołączoną metatabelę za pomocą
getmetatable() - Porównaj pobraną metatabelę z oryginalną
metaTable - Zwróć
true, jeśli są zgodne, a w przeciwnym raziefalse
Parametry:
mainTable(tabela): Tabela, do której zostanie dołączona metatabelametaTable(tabela): Metatabela do dołączenia
Zwraca: true, jeśli metatabela została pomyślnie dołączona i zweryfikowana, a w przeciwnym razie false (wartość logiczna)
Spróbuj swoich sił
function attachMetatable(mainTable, metaTable)
-- Wpisz 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