Menu
Coddy logo textTech

Firmas de Índice

Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 72 de 73.

Conociste los tipos de mapa como {[string]: number} en el capítulo de tablas; una firma de índice: cualquier clave string se asigna a un valor number. Destacan cuando las claves no se conocen mientras escribes el código: contadores, configuraciones, cachés, puntuaciones; cualquier cosa creada en tiempo de ejecución.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- cualquier clave de cadena está permitida
counts["sword"] = 1
counts["potion"] += 1  -- los valores se comprueban como números

Dos hechos en tiempo de ejecución son importantes al trabajar con mapas. Primero, leer una clave que nunca se estableció devuelve nil; el patrón de conteo clásico maneja esto con or, convirtiendo "missing" en 0:

counts[item] = (counts[item] or 0) + 1

Segundo, pairs() itera las claves de un mapa sin ningún orden garantizado: ejecutar el mismo programa dos veces puede visitar las claves de forma diferente. Siempre que la salida deba ser predecible, recolecta las claves en un array, ordénalas con table.sort e itera el array ordenado en su lugar:

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

Desafío

Fácil

Cuenta el botín con un mapa tipado.

  • Declara type Counts = {[string]: number}.
  • Escribe countItems(items: {string}): Counts que construya un nuevo mapa Counts, contando cuántas veces aparece cada cadena (usa el patrón (counts[item] or 0) + 1).
  • Crea local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} y cuéntalo.
  • Imprime una línea [name]: [count] por cada elemento distinto, en orden alfabético: recopila las claves, ordénalas con table.sort y después imprímelas.

Resultado esperado:

potion: 3
shield: 1
sword: 2

Pruébalo tú mismo

-- Escribe código aquí
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts usando (counts[item] or 0) + 1
-- 3) cuenta el array loot de la tarea
-- 4) recolecta las keys, table.sort them, imprime las líneas `{name}: {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 Introducción a Luau