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 tablaCuando 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 adicionalSi 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.
Desafío
FácilCrea una tabla llamada player con un campo score inicializado en 0.
Agrega dos funciones a la tabla:
player.setScore(self, value)- definida con sintaxis de punto y un parámetroselfexplícito. Estableceself.scoreal valor dado.player:addBonus(amount)- definida con sintaxis de dos puntos. Sumaamountaself.score.
Recibirás dos entradas:
- Un valor de puntuación inicial
- Una cantidad de bonificación para añadir
Realiza los siguientes pasos:
- Llama a
setScoreusando la sintaxis de punto (pasando la tabla como primer argumento) para establecer la puntuación inicial - Llama a
addBonususando la sintaxis de dos puntos para añadir la bonificación - 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 unselfexplí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 tablaUso 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 problemasUso 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)Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas