Menu
Coddy logo textTech

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 tabela

Quando 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 é esperado

Embora 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.

challenge icon

Desafio

Fácil

Crie uma tabela chamada player com um campo score inicializado com 0.

Adicione duas funções à tabela:

  1. player.setScore(self, value) - definida com sintaxe de ponto e parâmetro self explícito. Define self.score para o valor fornecido.
  2. player:addBonus(amount) - definida com sintaxe de dois pontos. Adiciona amount a self.score.

Você receberá duas entradas:

  1. Um valor de pontuação inicial
  2. Um valor de bônus para adicionar

Siga os seguintes passos:

  1. Chame setScore usando sintaxe de ponto (passando a tabela como o primeiro argumento) para definir a pontuação inicial
  2. Chame addBonus usando sintaxe de dois pontos para adicionar o bônus
  3. 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 um self explí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 tabela

Uso 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 problemas

Uso 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)
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