'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: 1Observe 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: 0Embora passar a tabela manualmente funcione, pode parecer repetitivo. Na próxima lição, você aprenderá uma sintaxe mais limpa que lida com isso automaticamente.
Desafio
FácilCrie 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
amountcomo o segundo parâmetro - Adicione
amountaself.count
Você receberá duas entradas:
- Primeiro valor a ser adicionado
- 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)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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse RetânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas