instanceof ja tyyppien introspektio
Toteuttakaa instanceof()-tarkistukset kulkemalla luokkahierarkiaa pitkin.
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
endinstanceof: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)) -- DogTyyppivartijat
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
endgetmetatable 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
endTyyppijä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
endVirheenkorjaus 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.
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
- Kantaluokan ja rakentajan suunnittelu
- Monitasoinen perintä
- Mixin-koostaminen ja rajapintojen tarkistus
- instanceof ja tyyppien introspektio