instanceof und Typ-Introspektion
Implementieren Sie instanceof()-Prüfungen, indem Sie die Klassenhierarchie durchlaufen
instanceof und Typ-Introspektion ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist instanceof?
instanceof(obj, Class) prüft, ob ein Objekt eine Instanz einer bestimmten Klasse oder einer ihrer Basisklassen ist. In OOP-Systemen ersetzt es Lua's ursprüngliches type().
Einfaches instanceof
Durchlaufen Sie die Metatabellenkette vom Objekt aus nach oben und suchen Sie nach der Zielklasse.
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 testen
Funktioniert korrekt über Vererbungsketten hinweg.
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)) -- falseKonvention für das Feld __type
Speichern Sie in jeder Klasse einen Zeichenketten-Typnamen für schnelle Typprüfungen zur Laufzeit.
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)) -- DogTypwächter
Erstellen Sie Typwächterfunktionen, um Prüfungen an API-Grenzen übersichtlicher zu gestalten.
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 zur Klassenerkennung
getmetatable(obj) gibt die Klassentabelle zurück. Vergleichen Sie sie mit einer bekannten Klasse, um den exakten Typ zu prüfen (ohne Vererbung zu berücksichtigen).
local function exactType(obj)
return getmetatable(obj)
end
print(exactType(rex) == Dog) -- true
print(exactType(rex) == Animal) -- false (not exact)Introspektion der Klassenhierarchie
Durchlaufen Sie die Metatabellenkette, um alle Klassen aufzulisten, von denen ein Objekt erbt.
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
endVergleich von Typsystemen
Lua's integriertes type() gibt nur 8 grundlegende Typen zurück. Verwenden Sie für OOP-Systeme instanceof oder benutzerdefinierte typeOf-Funktionen, die die Klassenhierarchie verstehen.
Versiegelte Klassen
Verhindern Sie die Bildung von Unterklassen, indem Sie die Methode :extend() aus einer Klasse entfernen oder eine Prüfung in __index hinzufügen.
Typbasierte Verteilung
Verteilen Sie Funktionsaufrufe anhand des Laufzeittyps – eine leichtgewichtige Alternative zur Methodenüberladung.
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
endDebugging mit Typinformationen
Fügen Sie Klassen __tostring hinzu, sodass der Typname in der Ausgabe enthalten ist und aussagekräftige Debugging-Informationen entstehen.
instanceof-Frage
Was gibt instanceof(rex, Animal) zurück, wenn Rex ein Dog ist (das Animal erweitert)?
Zusammenfassung: instanceof und Typ-Introspektion
instanceof durchläuft die Metatabellenkette, um eine Vererbung berücksichtigende Typprüfung durchzuführen. Verwenden Sie __type-Felder für eine schnelle Typbestimmung anhand einer Zeichenkette. Typwächter an API-Grenzen erkennen Typfehler frühzeitig und liefern klare Meldungen.
Häufig gestellte Fragen
Ist die Lektion „instanceof und Typ-Introspektion“ kostenlos?
Ja — der vollständige Text von „instanceof und Typ-Introspektion“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „instanceof und Typ-Introspektion“?
Implementieren Sie instanceof()-Prüfungen, indem Sie die Klassenhierarchie durchlaufen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „instanceof und Typ-Introspektion“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Entwurf von Basisklassen und Konstruktoren
- Mehrstufige Vererbung
- Mixin-Komposition und Schnittstellenprüfungen
- instanceof und Typ-Introspektion