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 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
-- Llamada con dos puntos: game:reset() es lo mismo que game.reset(game)
game:reset() -- self recibe correctamente game, así que esto funcionaSi 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í.
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 la sintaxis de punto y un parámetroselfexplícito. Estableceself.scoreal valor dado.player:addBonus(amount)- definida con la 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.
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)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 formas