Ponto vs Dois-pontos
Parte da seção Programação orientada a objetos do Journey de Lua da Coddy. Lição 4 de 70.
Agora que você conhece tanto a sintaxe com ponto quanto a sintaxe com dois-pontos, veja como elas se relacionam e o que dá errado quando a tabela não é passada.
Os dois-pontos são uma forma abreviada. Definir function game:addPoints(points) é o mesmo que definir function game.addPoints(self, points), e chamar game:addPoints(10) é o mesmo que chamar game.addPoints(game, 10). Um método funciona desde que a tabela seja recebida como seu primeiro argumento.
Veja o que acontece quando a tabela não é passada:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- ERRADO: chamada com ponto, mas nenhuma tabela foi passada
game.addPoints(10) -- Erro! self agora é 10, não a tabelaQuando você chama game.addPoints(10), Lua não passa game automaticamente. O valor 10 se torna self, e self.score falha porque 10 é um número, não uma tabela.
Uma função definida com um ponto e um self explícito funciona com uma chamada usando dois-pontos, porque os dois-pontos passam a tabela como esse primeiro argumento:
function game.reset(self)
self.score = 0
end
-- Chamar com dois-pontos: game:reset() é o mesmo que game.reset(game)
game:reset() -- self recebe game corretamente, então isso funcionaAs duas definições criam a mesma função, então a escolha é uma convenção: use os dois-pontos para definir e chamar funções que trabalham com self, e o ponto para funções que não usam self. Assim, cada chamada mostra se a tabela é passada.
Desafio
FácilCrie uma tabela chamada player com um campo score inicializado com 0.
Adicione duas funções à tabela:
player.setScore(self, value)- definida com sintaxe de ponto e o parâmetroselfexplícito. Defineself.scorecom o valor fornecido.player:addBonus(amount)- definida com sintaxe de dois-pontos. Adicionaamountaself.score.
Você receberá duas entradas:
- Um valor inicial de pontuação
- Uma quantidade de bônus a adicionar
Execute as seguintes etapas:
- Chame
setScoreusando sintaxe de ponto (passando a tabela como primeiro argumento) para definir a pontuação inicial - Chame
addBonususando sintaxe de dois-pontos para adicionar o bônus - Imprima o valor final de
player.score
Lembre-se: a forma como você chama cada função deve corresponder à forma como ela foi definida.
Experimente você mesmo
-- Leia a entrada
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Escreva seu código abaixo
-- 1. Crie uma tabela chamada 'player' com um campo 'score' inicializado com 0
-- 2. Adicione player.setScore(self, value) usando a sintaxe de ponto com self explícito
-- 3. Adicione player:addBonus(amount) usando a sintaxe de dois-pontos
-- 4. Chame setScore usando a sintaxe de ponto (passando a tabela como primeiro argumento)
-- 5. Chame addBonus usando a sintaxe de dois-pontos
-- Exiba a pontuação final
print(player.score)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 FormasPratique por conta própria: Compilador de Lua online