0Pricing
Lua Academy · Leçon

instanceof et introspection des types

Implémentez des vérifications instanceof() en parcourant la hiérarchie des classes.

instanceof et introspection des types est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.

Qu’est-ce que instanceof ?

instanceof(obj, Class) vérifie si un objet est une instance d’une classe précise ou de l’un de ses ancêtres. Il remplace le type() brut de Lua dans les systèmes orientés objet.

instanceof élémentaire

Parcourez la chaîne de tables de métadonnées depuis l’instance vers les ancêtres, en recherchant la classe cible.

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

Tester instanceof

Fonctionne correctement avec les chaînes d’héritage.

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

Convention du champ __type

Stockez le nom du type sous forme de chaîne dans chaque classe afin d’effectuer rapidement des vérifications de type à l’exécution.

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

Gardes de type

Créez des fonctions de garde de type pour effectuer des assertions plus claires aux limites de l’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 pour détecter les classes

getmetatable(obj) renvoie la table de la classe. Comparez-la à une classe connue pour vérifier le type exact (sans tenir compte de l’héritage).

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

Introspection de la hiérarchie des classes

Parcourez la chaîne de tables de métadonnées pour répertorier toutes les classes dont un objet hérite.

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

Comparaison des systèmes de types

Le type() intégré à Lua ne renvoie que 8 types de base. Pour les systèmes orientés objet, utilisez instanceof ou des fonctions typeOf personnalisées qui comprennent la hiérarchie des classes.

Classes scellées

Empêchez la création de sous-classes en supprimant la méthode :extend() d’une classe ou en ajoutant une vérification dans __index.

Distribution fondée sur le type

Distribuez les appels de fonction selon le type à l’exécution : une alternative légère à la surcharge de méthodes.

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

Débogage avec des informations de type

Ajoutez __tostring aux classes en y incluant le nom du type pour obtenir des informations de débogage pertinentes.

Question sur instanceof

Que renvoie instanceof(rex, Animal) si Rex est un Dog (qui étend Animal) ?

Récapitulatif : instanceof et introspection des types

instanceof parcourt la chaîne de tables de métadonnées pour effectuer une vérification de type tenant compte de l’héritage. Utilisez les champs __type pour rechercher rapidement un type sous forme de chaîne. Les gardes de type aux limites de l’API détectent rapidement les erreurs de type et fournissent des messages clairs.

Questions Fréquemment Posées

La leçon « instanceof et introspection des types » est-elle gratuite ?

Oui — le texte complet de « instanceof et introspection des types » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « instanceof et introspection des types » ?

Implémentez des vérifications instanceof() en parcourant la hiérarchie des classes. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Lua Academy ?

Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « instanceof et introspection des types » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?

Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Conception de la classe de base et du constructeur
  2. Héritage à plusieurs niveaux
  3. Composition de mixins et vérification des interfaces
  4. instanceof et introspection des types
← Retour à Lua Academy