Menu
Coddy logo textTech

Punto vs. dos puntos

Parte de la sección Object Oriented Programming 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 entender cuándo usar cada una y qué sucede cuando las mezclas incorrectamente.

La regla clave es sencilla: cómo defines una función debe coincidir con cómo la llamas. Si defines con dos puntos, llama con dos puntos. Si defines con un punto y un self explícito, llama con un punto y pasa la tabla.

Esto es lo que sucede cuando no coinciden:

local game = { score = 0 }

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

-- INCORRECTO: llamada con punto, pero no se pasó ninguna 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, causando un comportamiento inesperado o errores.

El error inverso también causa problemas:

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

-- INCORRECTO: llamar con dos puntos pasa game dos veces
game:reset()  -- self recibe game, pero también se espera un argumento nil adicional

Si bien este caso particular podría funcionar, crea confusión y puede romper funciones que esperan argumentos específicos. El enfoque más seguro es mantener la consistencia: usar dos puntos tanto para la definición como para la llamada cuando la función necesita self, y usar el punto cuando no lo necesita.

challenge icon

Desafío

Fácil

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

Agrega 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 al valor dado.
  2. player:addBonus(amount) - definida con sintaxis de dos puntos. Suma amount a self.score.

Recibirás dos entradas:

  1. Un valor de puntuación inicial
  2. Una cantidad de bonificación para añadir

Realiza los siguientes pasos:

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

Recuerda: haz coincidir la forma en que llamas a cada función con la forma en que fue definida.

Hoja de referencia

Al definir y llamar métodos en Lua, la sintaxis debe coincidir:

  • Si defines con dos puntos (:), llama con dos puntos
  • Si defines con un punto (.) y un self explícito, llama con un punto y pasa la tabla

Uso incorrecto - llamar con punto cuando se definió con dos puntos:

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

game.addPoints(10)  -- ¡Error! self se convierte en 10, no en la tabla

Uso incorrecto - llamar con dos puntos cuando se definió con punto:

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

game:reset()  -- Confuso: pasa game automáticamente pero puede causar problemas

Uso correcto - sintaxis coincidente:

-- Definir con dos puntos, llamar con dos puntos
function game:addPoints(points)
    self.score = self.score + points
end
game:addPoints(10)

-- Definir con punto, llamar con punto
function game.reset(self)
    self.score = 0
end
game.reset(game)

Pruébalo tú mismo

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

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


-- Imprimir 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 Object Oriented Programming