'self' explícito
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy — lección 2 de 70.
Cuando una función reside dentro de una tabla, a menudo necesita acceder o modificar datos dentro de esa misma tabla. Pero aquí está el problema: ¿cómo sabe la función a qué tabla pertenece?
La solución es pasar explícitamente la tabla como el primer argumento a la función. Por convención, este parámetro se llama self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- Salida: 1Observa cómo llamamos a counter.increment(counter), pasando la propia tabla como argumento. Dentro de la función, self ahora se refiere a esa tabla, lo que nos permite leer y modificar self.value.
Este patrón es esencial porque permite que la función trabaje con los datos de la tabla sin incluir de forma fija el nombre de la tabla. Considere una función que reinicia y devuelve el conteo actual:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Salida: 1
print(counter.value) -- Salida: 0Aunque pasar la tabla manualmente funciona, puede resultar repetitivo. En la siguiente lección, aprenderás una sintaxis más limpia que maneja esto automáticamente.
Desafío
FácilCrea una tabla llamada tracker con un campo count inicializado en 0.
Agrega una función tracker.addAmount(self, amount) que:
- Acepte
self(la tabla) como el primer parámetro - Acepte
amountcomo el segundo parámetro - Sume
amountaself.count
Recibirás dos entradas:
- Primera cantidad a sumar
- Segunda cantidad a sumar
Llama a tracker.addAmount dos veces (una por cada entrada), pasando la tabla como el primer argumento cada vez. Después de ambas llamadas, imprime el valor final de tracker.count.
Pruébalo tú mismo
-- Leer entrada
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO: Escribe tu código a continuación
-- Crea una tabla llamada 'tracker' con un campo 'count' inicializado en 0
-- Añade una función tracker.addAmount(self, amount) que sume amount a self.count
-- Llama a tracker.addAmount dos veces con la tabla como primer argumento
-- Mostrar el conteo final
print(tracker.count)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