Lua Academy · Lekcja

instanceof i introspekcja typów

Proszę implementować sprawdzanie instanceof() przez przechodzenie po hierarchii klas.

Lekcja 4 z 413 kroki

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
end

Testowanie 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))     -- false

Konwencja 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))  -- Dog

Straż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
end

getmetatable 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
end

Poró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
end

Debugowanie 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.

Bezpłatny start

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

  1. Projektowanie klasy bazowej i konstruktora
  2. Dziedziczenie wielopoziomowe
  3. Kompozycja mixinów i sprawdzanie interfejsów
  4. instanceof i introspekcja typów
← Powrót do Lua Academy