Menu
Coddy logo textTech

O Construtor :new()

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 8 de 70.

Criar objetos manualmente—criar uma tabela vazia, configurar sua metatabela, vincular __index—torna-se repetitivo. A solução padrão é definir um método construtor :new() diretamente na classe que lida com tudo isso para você.

Aqui está o padrão:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

Vamos analisar o que acontece dentro de :new(). Primeiro, criamos uma tabela vazia chamada instance. Depois, definimos seu metatable como self—que é Dog quando chamamos Dog:new().

Como Dog.__index aponta para Dog em si, a instância pode encontrar todos os métodos definidos em Dog. Finalmente, retornamos o novo objeto.

Observe a linha Dog.__index = Dog fora do construtor. Este é um atalho comum — em vez de criar uma metatabela separada, a tabela da classe serve tanto como o protótipo quanto como a metatabela.

Agora a criação de objetos é limpa e consistente:

local myDog = Dog:new()
myDog:bark()  -- Saída: Woof!

Cada classe que você criar seguirá esta mesma estrutura. O construtor :new() torna-se o único lugar onde a criação de objetos acontece, tornando seu código organizado e previsível.

challenge icon

Desafio

Fácil

Vamos construir uma classe Cat usando o padrão de construtor padrão que você acabou de aprender. Você organizará seu código em dois arquivos para praticar a estrutura adequada de módulos.

Você criará:

  • Cat.lua: Defina sua classe Cat com o padrão de construtor completo. Sua classe deve incluir:
    • A tabela da classe com __index apontando para si mesma
    • Um construtor :new() que cria uma instância, define seu metatable e a retorna
    • Um método :meow() que imprime o som do gato
    Retorne a tabela da classe ao final do arquivo.
  • main.lua: Importe seu módulo Cat e use o construtor para criar uma instância de gato. Em seguida, chame seu método para verificar se tudo está vinculado corretamente.

Você receberá uma entrada: o número de vezes que seu gato deve miar.

Seu método :meow() deve imprimir exatamente:

Meow!

No seu arquivo principal, crie um gato usando Cat:new() e chame :meow() o número de vezes especificado.

Por exemplo, se a entrada for 3, a saída deve ser:

Meow!
Meow!
Meow!

Folha de consulta

Para criar uma classe com um construtor em Lua, defina um método :new() que cria instâncias:

local ClassName = {}
ClassName.__index = ClassName

function ClassName:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function ClassName:method()
    -- implementação do método
end

O campo __index aponta para a própria classe, permitindo que as instâncias acessem métodos definidos na tabela da classe.

Dentro de :new():

  • Crie uma tabela vazia para a instância
  • Defina seu metatable como self (a classe)
  • Retorne a nova instância

Crie objetos usando o construtor:

local obj = ClassName:new()
obj:method()

Experimente você mesmo

-- Requer o módulo Cat
local Cat = require('Cat')

-- Lê a entrada: número de vezes para miar
local times = tonumber(io.read())

-- TODO: Criar uma instância de gato usando Cat:new()

-- TODO: Chamar o método :meow() o número especificado de vezes
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming