0Pricing
Lua Academy · Lección

for genérico y break

Utilice for genérico con pairs/ipairs y controle el flujo del bucle con break.

for genérico y break es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 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.

Protocolo de for genérico

El bucle for genérico de Lua funciona con una función iteradora. La sintaxis es for vars in iter_func, state, init do. En cada iteración, Lua llama a iter_func(state, lastVar) y asigna los valores devueltos a vars. El bucle se detiene cuando el primer valor devuelto es nil.

-- Manual use of next() iterator
local t = {a=1, b=2, c=3}
local key, val = next(t, nil)   -- first entry
while key ~= nil do
  print(key, val)
  key, val = next(t, key)       -- advance
end

pairs() para todas las claves

pairs(t) devuelve un iterador que recorre todos los pares clave-valor de una tabla, incluidas las claves de cadena, las claves enteras y las tablas con ambos tipos. El orden de iteración de las claves no enteras no está especificado (orden del hash). Se incluyen tanto la parte de array como la parte hash.

local config = {
  host = "localhost",
  port = 8080,
  debug = true,
  [1] = "first",
}

for key, value in pairs(config) do
  print(key, value)
end
-- Prints all 4 entries in any order

ipairs() para claves de array

ipairs(t) recorre las claves enteras comenzando por 1 y se detiene ante el primer valor nil. Es seguro, predecible y conserva el orden. Utilice ipairs para tablas similares a arrays cuando el orden sea importante y quiera detenerse ante el primer hueco.

local fruits = {"apple", "banana", "cherry"}

for i, fruit in ipairs(fruits) do
  print(i, fruit)
end
-- 1  apple
-- 2  banana
-- 3  cherry

-- stops at first nil
local t = {10, 20, nil, 40}
for i, v in ipairs(t) do
  print(i, v)  -- only 1,10 and 2,20
end

pairs frente a ipairs

Sepa cuándo utilizar cada uno: ipairs se usa para arrays secuenciales ordenados; pairs, para diccionarios o tablas mixtas. ipairs se detiene ante el primer hueco con nil; pairs visita todas las claves cuyo valor no es nil. Para arrays puros, ipairs es más idiomático.

local mixed = {10, 20, key="val", 30}

-- ipairs only sees array part in order
print("ipairs:")
for i, v in ipairs(mixed) do
  print(i, v)  -- 1:10, 2:20, 3:30
end

-- pairs sees everything
print("pairs:")
for k, v in pairs(mixed) do
  print(k, v)  -- 1:10, 2:20, 3:30, key:val
end

Iterador personalizado con un cierre

Puede escribir su propio iterador como un cierre. La función fábrica devuelve un cierre con estado que avanza la posición en cada llamada. Cuando no queda nada que devolver, devuelve nil para detener el for genérico.

local function range(from, to, step)
  step = step or 1
  local i = from - step
  return function()
    i = i + step
    if i <= to then return i end
  end
end

for n in range(1, 10, 2) do
  io.write(n .. " ")
end
print()  -- 1 3 5 7 9

string.gmatch como iterador

string.gmatch(s, pattern) devuelve un iterador sobre todas las coincidencias del patrón en la cadena s. Se utiliza habitualmente para dividir cadenas, extraer tokens o encontrar todas las apariciones de un patrón.

local sentence = "the quick brown fox"

for word in string.gmatch(sentence, "%a+") do
  print(word)
end
-- the
-- quick
-- brown
-- fox

break en un for genérico

Puede salir anticipadamente de un bucle for genérico mediante break. Esto resulta útil para buscar: recorra los elementos hasta encontrar una coincidencia y, a continuación, utilice break. Después de salir, la ejecución continúa en la instrucción situada después de end.

local inventory = {
  {name="sword", damage=50},
  {name="shield", armor=30},
  {name="bow", damage=35},
}

local target = "shield"
for i, item in ipairs(inventory) do
  if item.name == target then
    print("Found at index", i)
    break
  end
end

Modificar tablas durante la iteración

No inserte ni elimine claves de una tabla mientras la recorre con pairs(); el comportamiento no está definido (es posible que algunos cambios se detecten y otros se omitan). Si necesita modificar una tabla, recopile los cambios en una lista temporal y aplíquelos después del bucle.

local t = {a=1, b=2, c=3, d=4}
local toDelete = {}

-- Collect keys to delete
for k, v in pairs(t) do
  if v % 2 == 0 then
    toDelete[#toDelete+1] = k
  end
end

-- Delete after iteration
for _, k in ipairs(toDelete) do
  t[k] = nil
end
-- t = {a=1, c=3}

Patrón de enumeración

Cuando necesite tanto el índice como el valor, utilice ipairs, que proporciona ambos. Cuando solo necesite los valores y no le importe el índice, puede utilizar _ como nombre convencional de variable cuyo valor no se utiliza para el índice.

local colors = {"red", "green", "blue"}

-- With index
for i, color in ipairs(colors) do
  print(i .. ": " .. color)
end

-- Ignore index with _
for _, color in ipairs(colors) do
  print(color)  -- just the values
end

next() directamente

next(t, key) es la función subyacente para recorrer una tabla. Devuelve el siguiente par clave-valor después de key, o nil si no quedan más. next(t, nil) devuelve la primera entrada. Puede utilizar next(t) ~= nil para comprobar si una tabla no está vacía; es más rápido que contar sus elementos.

local function isEmpty(t)
  return next(t) == nil
end

print(isEmpty({}))       -- true
print(isEmpty({1,2,3}))  -- false
print(isEmpty({a=1}))    -- false

Comprobación rápida

¿Qué iterador se detiene ante el primer nil en una tabla?

Resumen: for genérico y break

Resumen:

  • pairs(t): todas las claves, en cualquier orden
  • ipairs(t): claves enteras de 1 a n, ordenadas, se detiene ante nil
  • Iteradores personalizados: devuelva un cierre que devuelva nil para detenerse
  • break permite salir anticipadamente del bucle
  • No modifique una tabla durante un recorrido con pairs; recopile los cambios y aplíquelos después
  • next(t) == nil: comprobación rápida de tabla vacía

Preguntas frecuentes

¿La lección «for genérico y break» es gratis?

Sí — el texto completo de «for genérico y break» 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 «for genérico y break»?

Utilice for genérico con pairs/ipairs y controle el flujo del bucle con break. 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 4 de 4.

¿Cuánto tiempo toma la lección «for genérico y break»?

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. Sentencias if, elseif y else
  2. Bucles while y repeat-until
  3. Bucle for numérico
  4. for genérico y break
← Volver a Lua Academy