0Pricing
Lua Academy · Lección

Upvalues compartidos entre closures

Aprenda cómo varias closures comparten el mismo upvalue y las implicaciones de modificarlo.

Upvalues compartidos entre closures es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

Compartir el mismo upvalue

Dos closures definidos en el mismo ámbito pueden compartir exactamente la misma celda de upvalue. Las modificaciones realizadas por uno son visibles para el otro.

local function makeGetterSetter()
  local value = 0
  local function get() return value end
  local function set(v) value = v end
  return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get())  -- 42

Por qué se comparten

Lua no copia los upvalues para cada closure. Todos los closures creados en el mismo bloque que apuntan a la misma variable local comparten una celda de upvalue.

Patrón Observer mediante un upvalue compartido

Un upvalue compartido puede actuar como un bus de mensajes entre varios closures.

local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get())  -- 1

Particularidad de las variables de bucle

En un bucle numeric for, cada iteración crea una nueva variable local de bucle, por lo que los closures capturan upvalues independientes.

local fns = {}
for i = 1, 3 do
  fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]())  -- 1 2 3 (each closure has its own i)

Particularidad de la variable de bucle while

En un bucle while, si captura una sola variable cuyo valor cambia, todos los closures comparten el mismo upvalue y ven el valor final.

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  fns[i] = function() return i end  -- all share same i!
end
print(fns[1]())  -- 3 (not 1!)

Capturar una nueva variable local

Para capturar valores independientes en un bucle while, introduzca una nueva variable local dentro del cuerpo del bucle.

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  local ci = i  -- new local per iteration
  fns[i] = function() return ci end
end
print(fns[1]())  -- 1, fns[2]() == 2

Patrón de módulo con estado compartido

Un módulo puede exponer varias funciones que compartan una tabla de estado privada mediante upvalues.

local function makeStack()
  local data = {}
  return {
    push = function(v) data[#data+1] = v end,
    pop  = function() local v = data[#data]; data[#data]=nil; return v end,
    size = function() return #data end,
  }
end

Alias y mutación

Tenga cuidado: todos los closures que referencian el mismo upvalue ven inmediatamente la misma modificación. Esto es potente, pero puede provocar un acoplamiento no deseado.

Identidad de un upvalue

debug.upvalueid(f, n) devuelve la identidad única del upvalue número n de la función f. Dos closures con el mismo ID de upvalue comparten la misma celda.

debug.upvaluejoin

debug.upvaluejoin(f1, n1, f2, n2) hace que el upvalue número n1 de f1 comparta la misma celda que el upvalue número n2 de f2. Es una herramienta de bajo nivel para depuración.

Patrones prácticos

  • Pares de getter y setter que comparten una variable privada.
  • Contador de eventos con una función de reinicio expuesta mediante varios closures.
  • Estado de módulo compartido entre varias funciones de la API.

Pregunta sobre upvalues compartidos

Los closures get y set se crean en el mismo ámbito y ambos capturan value. Si se llama a set(99), ¿qué devuelve get()?

Resumen: upvalues compartidos

Los closures del mismo ámbito comparten celdas de upvalue. Las modificaciones son visibles inmediatamente para todos los closures que las comparten. Esta es la base de la encapsulación y del estado de los módulos en Lua.

Preguntas frecuentes

¿La lección «Upvalues compartidos entre closures» es gratis?

Sí — el texto completo de «Upvalues compartidos entre closures» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Upvalues compartidos entre closures»?

Aprenda cómo varias closures comparten el mismo upvalue y las implicaciones de modificarlo. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Upvalues compartidos entre closures»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Qué son los upvalues?
  2. Upvalues compartidos entre closures
  3. Funciones fábrica y generadores
  4. Memoización con closures
← Volver a Lua Academy