Menu
Coddy logo textTech

'self' Explícito

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy — lição 2 de 70.

Quando uma função reside dentro de uma tabela, ela frequentemente precisa acessar ou modificar dados dentro dessa mesma tabela. Mas aqui está o problema: como a função sabe a qual tabela ela pertence?

A solução é passar explicitamente a tabela como o primeiro argumento para a função. Por convenção, este parâmetro é nomeado self:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- Saída: 1

Observe como chamamos counter.increment(counter), passando a própria tabela como argumento. Dentro da função, self agora se refere a essa tabela, permitindo-nos ler e modificar self.value.

Este padrão é essencial porque permite que a função trabalhe com os dados da tabela sem definir o nome da tabela de forma fixa (hardcoding). Considere uma função que redefine e retorna a contagem atual:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- Saída: 1
print(counter.value)           -- Saída: 0

Embora passar a tabela manualmente funcione, pode parecer repetitivo. Na próxima lição, você aprenderá uma sintaxe mais limpa que lida com isso automaticamente.

challenge icon

Desafio

Fácil

Crie uma tabela chamada tracker com um campo count inicializado como 0.

Adicione uma função tracker.addAmount(self, amount) que:

  • Aceite self (a tabela) como o primeiro parâmetro
  • Aceite amount como o segundo parâmetro
  • Adicione amount a self.count

Você receberá duas entradas:

  1. Primeiro valor a ser adicionado
  2. Segundo valor a ser adicionado

Chame tracker.addAmount duas vezes (uma para cada entrada), passando a tabela como o primeiro argumento em cada vez. Após ambas as chamadas, imprima o valor final de tracker.count.

Experimente você mesmo

-- Ler entrada
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- TODO: Escreva seu código abaixo
-- Crie uma tabela chamada 'tracker' com um campo 'count' inicializado em 0
-- Adicione uma função tracker.addAmount(self, amount) que adiciona amount a self.count
-- Chame tracker.addAmount duas vezes com a tabela como o primeiro argumento


-- Saída da contagem final
print(tracker.count)
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