Ponto vs Dois-pontos
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 4 de 70.
Agora que você conhece as sintaxes de ponto e de dois pontos, é crucial entender quando usar cada uma — e o que acontece quando você as mistura incorretamente.
A regra principal é simples: como você define uma função deve corresponder a como você a chama. Se você definir com dois pontos, chame com dois pontos. Se você definir com um ponto e um self explícito, chame com um ponto e passe a tabela.
Aqui está o que acontece quando você os combina incorretamente:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- ERRADO: chamando com ponto, mas nenhuma tabela foi passada
game.addPoints(10) -- Erro! self agora é 10, não a tabelaQuando você chama game.addPoints(10), o Lua não passa automaticamente game. O valor 10 torna-se self, causando comportamento inesperado ou erros.
O erro inverso também causa problemas:
function game.reset(self)
self.score = 0
end
-- ERRADO: chamar com dois pontos passa game duas vezes
game:reset() -- self recebe game, mas um argumento nil extra também é esperadoEmbora este caso específico possa funcionar, ele cria confusão e pode quebrar funções que esperam argumentos específicos. A abordagem mais segura é manter a consistência: use dois pontos tanto para a definição quanto para a chamada quando a função precisar de self, e use o ponto quando não precisar.
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 parâmetroselfexplícito. Defineself.scorepara o valor fornecido.player:addBonus(amount)- definida com sintaxe de dois pontos. Adicionaamountaself.score.
Você receberá duas entradas:
- Um valor de pontuação inicial
- Um valor de bônus para adicionar
Siga os seguintes passos:
- Chame
setScoreusando sintaxe de ponto (passando a tabela como o 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: faça a chamada de cada função corresponder à forma como ela foi definida.
Folha de consulta
Ao definir e chamar métodos em Lua, a sintaxe deve corresponder:
- Se você definir com dois pontos (
:), chame com dois pontos - Se você definir com um ponto (
.) e umselfexplícito, chame com um ponto e passe a tabela
Uso incorreto - chamando com ponto quando definido com dois pontos:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- Erro! self se torna 10, não a tabelaUso incorreto - chamando com dois pontos quando definido com ponto:
function game.reset(self)
self.score = 0
end
game:reset() -- Confuso: passa game automaticamente, mas pode causar problemasUso correto - sintaxe correspondente:
-- Define com dois pontos, chama com dois pontos
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- Define com ponto, chama com ponto
function game.reset(self)
self.score = 0
end
game.reset(game)Experimente você mesmo
-- Ler 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 em 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
-- Exibir 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 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