Lua Academy · Aula

instanceof e introspecção de tipos

Implemente verificações instanceof() percorrendo a hierarquia de classes.

Aula 4 de 413 etapas

instanceof e introspecção de tipos é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O que é instanceof?

instanceof(obj, Class) verifica se um objeto é uma instância de uma classe específica ou de qualquer um de seus ancestrais. Ele substitui o type() básico do Lua nos sistemas orientados a objetos.

instanceof simples

Percorra a cadeia de metatabelas da instância para cima, procurando a classe de destino.

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

Testando instanceof

Funciona corretamente em cadeias de herança.

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

Convenção do campo __type

Armazene o nome textual do tipo em cada classe para realizar verificações rápidas de tipo em tempo de execução.

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 tipo

Crie funções de guarda de tipo para fazer asserções de forma mais clara nos limites da 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 detecção de classes

getmetatable(obj) retorna a tabela da classe. Compare-a com uma classe conhecida para testar o tipo exato (sem considerar a herança).

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

Introspecção da hierarquia de classes

Percorra a cadeia de metatabelas para listar todas as classes das quais um objeto herda.

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

Comparação de sistemas de tipos

O type() integrado do Lua retorna apenas 8 tipos básicos. Nos sistemas orientados a objetos, use instanceof ou funções typeOf personalizadas que entendam a hierarquia de classes.

Classes seladas

Impeça a criação de subclasses removendo o método :extend() de uma classe ou adicionando uma verificação em __index.

Despacho baseado em tipo

Selecione as funções a serem chamadas com base no tipo em tempo de execução — uma alternativa leve à 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

Depuração com informações de tipo

Adicione __tostring às classes, incluindo o nome do tipo, para obter uma saída de depuração significativa.

Pergunta sobre instanceof

O que instanceof(rex, Animal) retorna se Rex for um Dog (que estende Animal)?

Recapitulação: instanceof e introspecção de tipos

instanceof percorre a cadeia de metatabelas para verificar tipos levando a herança em consideração. Use campos __type para obter rapidamente o tipo como texto. Guardas de tipo nos limites da API detectam erros de tipo antecipadamente e exibem mensagens claras.

Grátis para começar

Aprenda Lua com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
40
Aulas
159

Perguntas Frequentes

A aula “instanceof e introspecção de tipos” é grátis?

Sim — o texto completo de “instanceof e introspecção de tipos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “instanceof e introspecção de tipos”?

Implemente verificações instanceof() percorrendo a hierarquia de classes. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “instanceof e introspecção de tipos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Design de classe-base e construtor
  2. Herança em vários níveis
  3. Composição de mixins e verificações de interface
  4. instanceof e introspecção de tipos
← Voltar para Lua Academy