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 tablaCuando 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 funcionaAunque 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.
Desafío
FácilCrea una tabla llamada player con un campo score inicializado en 0.
Añade dos funciones a la tabla:
player.setScore(self, value)- definida con sintaxis de punto y un parámetroselfexplícito. Estableceself.scoreen el valor proporcionado.player:addBonus(amount)- definida con sintaxis de dos puntos. Añadeamountaself.score.
Recibirás dos entradas:
- Un valor de puntuación inicial
- Una cantidad adicional que añadir
Realiza los siguientes pasos:
- Llama a
setScoreusando sintaxis de punto (pasando la tabla como primer argumento) para establecer la puntuación inicial - Llama a
addBonususando sintaxis de dos puntos para añadir la cantidad adicional - 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)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
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 formasPractica por tu cuenta: Compilador de Lua online