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 tablaCuando 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 funcionaAmbas 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.
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 el parámetro explícitoself. Estableceself.scoreen el valor indicado.player:addBonus(amount)- definida con sintaxis de dos puntos. Añadeamountaself.score.
Recibirás dos entradas:
- Un valor de puntuación inicial
- Una cantidad de puntos extra 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 los puntos extra - 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)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