Menu
CoddyTech

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 con punto como la sintaxis con dos puntos, veamos cómo se relacionan y qué sale mal cuando no se pasa la tabla.

Ambos dos puntos son una forma abreviada. Definir function game:addPoints(points) es lo mismo que definir function game.addPoints(self, points), y llamar a game:addPoints(10) es lo mismo que llamar a game.addPoints(game, 10). Un método funciona siempre que la tabla llegue como su primer argumento.

Esto es lo que ocurre cuando no se pasa la tabla:

local game = { score = 0 }

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

-- INCORRECTO: se llama con un punto, pero no se pasa 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, y self.score falla porque 10 es un número, no una tabla.

Una función definida con un punto y un self explícito funciona con una llamada con dos puntos, porque los dos puntos pasan la tabla como ese primer argumento:

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

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

Ambas definiciones crean la misma función, así que la elección es una convención: usa los dos puntos para definir y llamar funciones que trabajan con self, y el punto para las funciones que no usan self. Así, cada llamada muestra si se pasa la tabla.

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 el parámetro explícito self. Establece self.score en el valor indicado.
  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 de puntos extra 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 los puntos extra
  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

-- Lee la 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


-- Muestra 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