Menu
Coddy logo textTech

'self' Explícito

Parte da seção Object Oriented Programming 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.

Folha de consulta

Funções dentro de tabelas podem acessar os dados da tabela recebendo a própria tabela como seu primeiro parâmetro, convencionalmente chamado de self:

local counter = {
    value = 0
}

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

counter.increment(counter)  -- Passa a tabela como argumento
print(counter.value)  -- Output: 1

O parâmetro self permite que a função leia e modifique os campos da tabela sem codificar rigidamente o nome da tabela:

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

print(counter.reset(counter))  -- Output: 1
print(counter.value)           -- Output: 0

As funções podem aceitar parâmetros adicionais após o self:

function counter.add(self, amount)
    self.value = self.value + amount
end

counter.add(counter, 5)

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 Object Oriented Programming