instanceof i introspekcja typów
Proszę implementować sprawdzanie instanceof() przez przechodzenie po hierarchii klas.
instanceof i introspekcja typów to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Czym jest instanceof?
instanceof(obj, Class) sprawdza, czy obiekt jest instancją określonej klasy lub dowolnej z jej klas nadrzędnych. W systemach obiektowych zastępuje surową funkcję Lua type().
Prosty instanceof
Należy przejść w górę łańcucha metatabeli, zaczynając od instancji, i wyszukać klasę docelową.
local function instanceof(obj, cls)
if type(obj) ~= "table" then return false end
local mt = getmetatable(obj)
while mt do
if mt == cls then return true end
local parent = getmetatable(mt)
mt = parent and parent.__index
end
return false
endTestowanie instanceof
Działa poprawnie w całych łańcuchach dziedziczenia.
local cat = Animal:new("Cat","Meow")
local rex = Dog:new("Rex")
print(instanceof(rex, Dog)) -- true
print(instanceof(rex, Animal)) -- true
print(instanceof(cat, Dog)) -- falseKonwencja pola __type
Należy przechowywać w każdej klasie tekstową nazwę typu, aby szybko sprawdzać typ w czasie wykonywania.
Animal.__type = "Animal"
Dog.__type = "Dog"
local function typeOf(obj)
local mt = getmetatable(obj)
return mt and mt.__type or type(obj)
end
print(typeOf(rex)) -- DogStrażnicy typów
Należy utworzyć funkcje strażników typów, aby czytelniej przeprowadzać asercje na granicach interfejsu API.
local function assertType(obj, cls, argName)
if not instanceof(obj, cls) then
error(("Expected %s for %s, got %s"):format(
cls.__name, argName, typeOf(obj)), 2)
end
endgetmetatable do wykrywania klasy
getmetatable(obj) zwraca tabelę klasy. Należy porównać ją ze znaną klasą, aby sprawdzić dokładny typ (bez uwzględniania dziedziczenia).
local function exactType(obj)
return getmetatable(obj)
end
print(exactType(rex) == Dog) -- true
print(exactType(rex) == Animal) -- false (not exact)Introspekcja hierarchii klas
Należy przejść przez łańcuch metatabel, aby wyświetlić wszystkie klasy, po których obiekt dziedziczy.
local function classChain(obj)
local chain = {}
local mt = getmetatable(obj)
while mt do
chain[#chain+1] = mt.__name or "?"
local parent = getmetatable(mt)
mt = parent and parent.__index
end
return chain
endPorównanie systemów typów
Wbudowana funkcja Lua type() zwraca tylko 8 podstawowych typów. W systemach obiektowych należy używać instanceof lub własnych funkcji typeOf, które rozumieją hierarchię klas.
Klasy zapieczętowane
Należy uniemożliwić dziedziczenie, usuwając metodę :extend() z klasy lub dodając sprawdzenie w __index.
Rozsyłanie na podstawie typu
Rozsyłanie wywołań funkcji na podstawie typu w czasie wykonywania — to lekką alternatywa dla przeciążania metod.
local function process(animal)
if instanceof(animal, Dog) then
print("Processing Dog:", animal.name)
elseif instanceof(animal, Animal) then
print("Processing Animal:", animal.name)
end
endDebugowanie z informacjami o typie
Należy dodać do klas __tostring zawierające nazwę typu, aby uzyskać użyteczne dane wyjściowe debugowania.
Pytanie o instanceof
Co zwróci instanceof(rex, Animal), jeśli Rex jest obiektem Dog (który rozszerza Animal)?
Podsumowanie: instanceof i introspekcja typów
instanceof przechodzi przez łańcuch metatabel, aby sprawdzać typ z uwzględnieniem dziedziczenia. Do szybkiego wyszukiwania typu na podstawie tekstu należy używać pól __type. Strażnicy typów na granicach interfejsu API wcześnie wykrywają błędy typów i przekazują jasne komunikaty.
Ucz się Lua dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 40
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „instanceof i introspekcja typów” jest bezpłatna?
Tak — pełny tekst „instanceof i introspekcja typów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „instanceof i introspekcja typów”?
Proszę implementować sprawdzanie instanceof() przez przechodzenie po hierarchii klas. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „instanceof i introspekcja typów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Projektowanie klasy bazowej i konstruktora
- Dziedziczenie wielopoziomowe
- Kompozycja mixinów i sprawdzanie interfejsów
- instanceof i introspekcja typów