Lua Academy · Lección

instanceof e introspección de tipos

Implemente comprobaciones instanceof() recorriendo la jerarquía de clases.

Lección 4 de 413 pasos

instanceof e introspección de tipos es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué es instanceof?

instanceof(obj, Class) comprueba si un objeto es una instancia de una clase específica o de cualquiera de sus antecesoras. Sustituye a type() sin formato de Lua en los sistemas de POO.

instanceof sencillo

Recorra la cadena de metatablas desde la instancia hacia arriba y busque la clase objetivo.

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

Prueba de instanceof

Funciona correctamente en cadenas de herencia.

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

Convención del campo __type

Almacene un nombre de tipo en forma de cadena en cada clase para realizar comprobaciones rápidas del tipo en tiempo de ejecución.

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

Guardas de tipos

Cree funciones de guarda de tipos para realizar aserciones de forma más clara en los límites de la 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 para detectar clases

getmetatable(obj) devuelve la tabla de la clase. Compárela con una clase conocida para comprobar el tipo exacto (sin tener en cuenta la herencia).

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

Introspección de la jerarquía de clases

Recorra la cadena de metatablas para enumerar todas las clases de las que hereda un objeto.

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

Comparación de sistemas de tipos

La función integrada type() de Lua solo devuelve 8 tipos básicos. En los sistemas de POO, utilice instanceof o funciones typeOf personalizadas que comprendan la jerarquía de clases.

Clases selladas

Impidа la creación de subclases eliminando el método :extend() de una clase o añadiendo una comprobación en __index.

Despacho basado en tipos

Despache las llamadas a funciones según el tipo en tiempo de ejecución: es una alternativa ligera a la sobrecarga de métodos.

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

Depuración con información de tipos

Añada __tostring a las clases e incluya el nombre del tipo para obtener información de depuración significativa.

Pregunta sobre instanceof

¿Qué devuelve instanceof(rex, Animal) si Rex es un Dog (que hereda de Animal)?

Repaso: instanceof e introspección de tipos

instanceof recorre la cadena de metatablas para comprobar los tipos teniendo en cuenta la herencia. Utilice campos __type para consultar rápidamente el tipo en forma de cadena. Las guardas de tipos en los límites de la API detectan pronto los errores de tipo y muestran mensajes claros.

Gratis para empezar

Aprende Lua con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
40
Lecciones
159

Preguntas frecuentes

¿La lección «instanceof e introspección de tipos» es gratis?

Sí — el texto completo de «instanceof e introspección de tipos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «instanceof e introspección de tipos»?

Implemente comprobaciones instanceof() recorriendo la jerarquía de clases. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «instanceof e introspección de tipos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Diseño de clases base y constructores
  2. Herencia multinivel
  3. Composición de mixins y comprobaciones de interfaces
  4. instanceof e introspección de tipos
← Volver a Lua Academy