'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: 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.
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: 1O 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: 0As 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)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
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ângulo2Padrã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