Menu
Coddy logo textTech

Inicializando Atributos

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

O construtor :new() que você aprendeu cria objetos, mas cada instância começa idêntica. Objetos reais precisam de dados únicos — uma pessoa tem um nome específico, um jogador tem uma pontuação inicial. Para tornar os objetos úteis, o construtor deve aceitar argumentos e atribuí-los à nova instância.

Veja como expandir o construtor para aceitar valores iniciais:

local Dog = {}
Dog.__index = Dog

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

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

O construtor agora recebe name e breed como parâmetros. Após criar a instância vazia e definir sua metatabela, atribuímos esses valores diretamente aos campos da instância. Cada objeto criado terá seu próprio name e breed.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Saída: Eu sou Rex, um Pastor Alemão
dog2:introduce()  -- Saída: Eu sou Bella, um Poodle

Ambos os cães compartilham o mesmo método :introduce() do protótipo, mas cada um possui seu próprio nome e raça exclusivos armazenados em sua tabela de instância. Este é o poder de combinar protótipos com construtores parametrizados — comportamento compartilhado com estado individual.

challenge icon

Desafio

Fácil

Vamos construir uma classe Person que cria indivíduos únicos com seus próprios nomes e idades. Você organizará seu código em dois arquivos para praticar a estrutura adequada de módulos.

Você criará:

  • Person.lua: Defina sua classe Person com um construtor que aceita um nome e uma idade. Inclua um método :introduce() que permite que cada pessoa se apresente.
  • main.lua: Requeira seu módulo Person e crie uma instância de pessoa usando as entradas fornecidas. Em seguida, faça com que ela se apresente.

Seu construtor :new(name, age) deve aceitar ambos os valores e armazená-los na nova instância. O método :introduce() deve imprimir exatamente neste formato:

Hello, my name is [name] and I am [age] years old

Você receberá duas entradas:

  1. O nome da pessoa
  2. A idade da pessoa

Por exemplo, se as entradas forem Alice e 25, a saída deve ser:

Hello, my name is Alice and I am 25 years old

Folha de consulta

Para criar objetos com dados únicos, expanda o construtor :new() para aceitar parâmetros e atribuí-los à instância:

local Dog = {}
Dog.__index = Dog

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

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Crie instâncias com valores diferentes:

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Saída: I am Rex, a German Shepherd
dog2:introduce()  -- Saída: I am Bella, a Poodle

Cada objeto possui seus próprios dados exclusivos armazenados em sua tabela de instância, enquanto compartilha métodos do protótipo.

Experimente você mesmo

-- Importa o módulo Person
local Person = require('Person')

-- Lê a entrada
local name = io.read()
local age = io.read()

-- TODO: Cria uma nova instância de Person usando Person:new(name, age)

-- TODO: Chama o método introduce() na sua instância de person
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