Menu
Coddy logo textTech

Variáveis de Instância

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 12 de 70.

Boas-vindas a um novo capítulo focado em como os objetos gerenciam seus dados internos. Você aprendeu a criar classes e instâncias; agora é hora de explorar como cada instância armazena e gerencia seu próprio estado exclusivo.

Variáveis de instância são campos que pertencem exclusivamente a um único objeto. Quando você atribui um valor a self.something dentro de um método ou construtor, esses dados existem apenas nessa instância específica. Outros objetos da mesma classe têm suas próprias cópias separadas.

Isso se torna especialmente importante ao armazenar dados complexos, como tabelas. Considere um sistema de inventário em que cada personagem carrega itens diferentes:

local Inventory = {}
Inventory.__index = Inventory

function Inventory:new()
    local instance = {}
    setmetatable(instance, self)
    instance.items = {}  -- Cada instância recebe sua própria tabela vazia
    return instance
end

function Inventory:addItem(item)
    table.insert(self.items, item)
end

A linha principal é instance.items = {}. Ao criar uma nova tabela vazia dentro do construtor, cada objeto de inventário recebe sua própria lista distinta. Se, em vez disso, você definisse items na própria tabela da classe, todas as instâncias acidentalmente compartilhariam a mesma tabela: adicionar uma espada a um personagem daria essa espada a todos!

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- Saída: 1
print(#bag2.items)  -- Saída: 1

Cada inventário mantém sua própria coleção. Esse padrão se aplica sempre que uma instância precisa acompanhar dados que mudam de forma independente: listas, contadores ou qualquer estado mutável exclusivo desse objeto.

challenge icon

Desafio

Fácil

Vamos criar um sistema de ShoppingCart em que cada carrinho mantém sua própria lista separada de produtos. Isso demonstrará como as variáveis de instância mantêm os dados isolados entre os objetos: adicionar itens a um carrinho não afetará outro!

Você organizará seu código em dois arquivos:

  • ShoppingCart.lua: defina sua classe ShoppingCart, em que cada instância tem sua própria tabela products. Inclua:
    • Um construtor :new() que inicializa uma lista de produtos vazia para cada carrinho
    • Um método :addProduct(productName) que adiciona um produto à lista deste carrinho
    • Um método :listProducts() que imprime cada produto em uma linha separada
  • main.lua: importe seu módulo ShoppingCart e crie dois carrinhos separados. Adicione produtos diferentes a cada carrinho para provar que eles mantêm inventários independentes.

Você receberá quatro entradas:

  1. Primeiro produto a ser adicionado ao carrinho A
  2. Segundo produto a ser adicionado ao carrinho A
  3. Primeiro produto a ser adicionado ao carrinho B
  4. Segundo produto a ser adicionado ao carrinho B

No seu arquivo principal:

  1. Crie dois carrinhos de compras: cartA e cartB
  2. Adicione os dois primeiros produtos a cartA
  3. Adicione os dois últimos produtos a cartB
  4. Imprima Cart A: e depois liste os produtos do carrinho A
  5. Imprima Cart B: e depois liste os produtos do carrinho B

Por exemplo, se as entradas forem Apple, Bread, Milk e Eggs, a saída deverá ser:

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

Lembre-se: o segredo é inicializar products como uma nova tabela vazia dentro do construtor. Isso garante que cada instância do carrinho receba sua própria lista separada, em vez de compartilhar uma tabela entre todos os carrinhos.

Experimente você mesmo

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

-- Lê as entradas
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()

-- TODO: Crie dois carrinhos de compras: cartA e cartB

-- TODO: Adicione product1 e product2 ao cartA

-- TODO: Adicione product3 e product4 ao cartB

-- TODO: Imprima "Cart A:" e então liste os produtos de cartA

-- TODO: Imprima "Cart B:" e então liste os produtos de cartB
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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online