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 entender cuándo usar cada una y qué sucede cuando las mezclas de forma incorrecta.

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: llamando 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, lo que provoca un comportamiento inesperado o errores.

La dirección inversa es más permisiva:

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

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

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 ser consistente: usa dos puntos tanto para la definición como para la llamada cuando la función necesite self, y usa el punto cuando no sea así.

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 la sintaxis de punto y un parámetro self explícito. Establece self.score al valor dado.
  2. player:addBonus(amount) - definida con la 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.

Pruébalo tú mismo

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

-- TODO: Escribe tu código abajo
-- 1. Crea una tabla llamada 'player' con un campo 'score' inicializado en 0
-- 2. Agrega player.setScore(self, value) usando la sintaxis de punto con self explícito
-- 3. Agrega 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 Programación Orientada a Objetos