Menu
Coddy logo textTech

Punto vs. dos puntos

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 4 de 70.

Ahora que conoces tanto la sintaxis de punto como la de dos puntos, es crucial comprender cuándo usar cada una y qué sucede cuando las mezclas incorrectamente.

La regla clave es sencilla: la forma en que defines una función debe coincidir con la forma en que la llamas. Si la defines con dos puntos, llámala con dos puntos. Si la defines con un punto y un self explícito, llámala con un punto y pasa la tabla.

Esto es lo que ocurre cuando no los haces coincidir:

local game = { score = 0 }

function game:addPoints(points)
    self.score = self.score + points
end

-- WRONG: llamando con punto, pero no se pasó la tabla
game.addPoints(10)  -- Error! self ahora es 10, no la tabla

Cuando llamas a game.addPoints(10), Lua no pasa automáticamente game. El valor 10 se convierte en self, lo que provoca un comportamiento inesperado o errores.

La dirección inversa es más permisiva:

function game.reset(self)
    self.score = 0
end

-- Llamando con dos puntos: game:reset() es lo mismo que game.reset(game)
game:reset()  -- self recibe correctamente game, así que esto funciona

Aunque este caso concreto podría funcionar, crea confusión y puede romper funciones que esperan argumentos específicos. El enfoque más seguro es mantener la coherencia: usa dos puntos tanto en la definición como en la llamada cuando la función necesite self, y usa un punto cuando no lo necesite.

challenge icon

Desafío

Fácil

Crea una tabla llamada player con un campo score inicializado en 0.

Añade dos funciones a la tabla:

  1. player.setScore(self, value) - definida con sintaxis de punto y un parámetro self explícito. Establece self.score en el valor proporcionado.
  2. player:addBonus(amount) - definida con sintaxis de dos puntos. Añade amount a self.score.

Recibirás dos entradas:

  1. Un valor de puntuación inicial
  2. Una cantidad adicional que añadir

Realiza los siguientes pasos:

  1. Llama a setScore usando sintaxis de punto (pasando la tabla como primer argumento) para establecer la puntuación inicial
  2. Llama a addBonus usando sintaxis de dos puntos para añadir la cantidad adicional
  3. Imprime el valor final de player.score

Recuerda: adapta la forma en que llamas a cada función a la forma en que fue definida.

Pruébalo tú mismo

-- Leer entrada
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())

-- TODO: Escribe tu código debajo
-- 1. Crea una tabla llamada 'player' con un campo 'score' inicializado a 0
-- 2. Añade player.setScore(self, value) usando sintaxis de punto con self explícito
-- 3. Añade player:addBonus(amount) usando sintaxis de dos puntos
-- 4. Llama a setScore usando sintaxis de punto (pasando la tabla como primer argumento)
-- 5. Llama a addBonus usando sintaxis de dos puntos


-- Imprime la puntuación final
print(player.score)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online