Lua Academy · Oppitunti

instanceof ja tyyppien introspektio

Toteuttakaa instanceof()-tarkistukset kulkemalla luokkahierarkiaa pitkin.

Oppitunti 4/413 vaihetta

instanceof ja tyyppien introspektio on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on instanceof?

instanceof(obj, Class) tarkistaa, onko olio tietyn luokan tai jonkin sen esi-isäluokan ilmentymä. Se korvaa Lua:n raakadatan type() olio-ohjelmointijärjestelmissä.

Yksinkertainen instanceof

Käykää metataulukkoketju läpi ilmentymästä ylöspäin ja etsikää kohdeluokkaa.

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

instanceof:n testaaminen

Toimii oikein periytymisketjuissa.

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

__type-kentän käytäntö

Tallentakaa jokaiseen luokkaan merkkijonona tyyppinimi nopeita ajonaikaisia tyyppitarkistuksia varten.

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

Tyyppivartijat

Luokaa tyyppivartijafunktioita, jotta rajapinnoilla tehtävät väitteet ovat selkeämpiä.

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 luokan tunnistamiseen

getmetatable(obj) palauttaa luokkataulukon. Verratkaa sitä tunnettuun luokkaan täsmällisen tyypin testaamiseksi; periytymistä ei oteta huomioon.

local function exactType(obj)
  return getmetatable(obj)
end
print(exactType(rex) == Dog)  -- true
print(exactType(rex) == Animal)  -- false (not exact)

Luokkahierarkian introspektio

Käykää metataulukkoketju läpi ja luetelkaa kaikki luokat, joista olio periytyy.

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

Tyyppijärjestelmien vertailu

Luan sisäinen type() palauttaa vain kahdeksan perustyyppiä. Olio-ohjelmointijärjestelmissä käyttäkää instanceof-funktiota tai mukautettuja typeOf-funktioita, jotka ymmärtävät luokkahierarkian.

Sinetöidyt luokat

Estäkää aliluokkien luominen poistamalla luokasta :extend()-metodi tai lisäämällä tarkistus kohteeseen __index.

Tyypin perusteella tehtävä dispatch

Ohjatkaa funktiokutsut ajonaikaisen tyypin perusteella. Tämä on kevyt vaihtoehto metodien ylikuormitukselle.

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

Virheenkorjaus tyyppitietojen avulla

Lisätkää luokkiin __tostring, joka sisältää tyypin nimen ja tuottaa näin merkityksellisiä virheenkorjaustulosteita.

instanceof-kysymys

Mitä instanceof(rex, Animal) palauttaa, jos Rex on Dog, joka laajentaa Animal-luokkaa?

Kertaus: instanceof ja tyyppi-introspektio

instanceof käy metataulukkoketjun läpi ja tekee periytymisen huomioivan tyyppitarkistuksen. Käyttäkää __type-kenttiä nopeaan merkkijonopohjaiseen tyyppihakuun. Rajapinnoilla käytettävät tyyppivartijat havaitsevat tyyppivirheet ajoissa selkeine viesteineen.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”instanceof ja tyyppien introspektio” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “instanceof ja tyyppien introspektio”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”instanceof ja tyyppien introspektio”?

Toteuttakaa instanceof()-tarkistukset kulkemalla luokkahierarkiaa pitkin. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”instanceof ja tyyppien introspektio”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kantaluokan ja rakentajan suunnittelu
  2. Monitasoinen perintä
  3. Mixin-koostaminen ja rajapintojen tarkistus
  4. instanceof ja tyyppien introspektio
← Takaisin: Lua Academy