'self' explícito
Parte de la sección Object Oriented Programming 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.
Hoja de referencia
Las funciones dentro de las tablas pueden acceder a los datos de la tabla recibiendo la tabla como su primer parámetro, convencionalmente llamado self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter) -- Pass the table as argument
print(counter.value) -- Output: 1El parámetro self permite que la función lea y modifique los campos de la tabla sin escribir directamente el nombre de la tabla:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Output: 1
print(counter.value) -- Output: 0Las funciones pueden aceptar parámetros adicionales después de self:
function counter.add(self, amount)
self.value = self.value + amount
end
counter.add(counter, 5)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 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