Menu
Coddy logo textTech

'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: 1

Observa 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: 0

Aunque 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.

challenge icon

Desafío

Fácil

Crea 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 amount como el segundo parámetro
  • Sume amount a self.count

Recibirás dos entradas:

  1. Primera cantidad a sumar
  2. 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: 1

El 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: 0

Las 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)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming