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.

Ya conociste los tipos de mapa como {[string]: number} en el capítulo sobre tablas: una firma de índice: cualquier clave de cadena se asigna a un valor numérico. Son ideales cuando no se conocen las claves mientras escribes el código: contadores, configuraciones, cachés, puntuaciones; cualquier cosa que se construya durante el tiempo de ejecución.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- se permite cualquier clave de tipo string
counts["sword"] = 1
counts["potion"] += 1  -- los valores se comprueban como números

Hay dos aspectos del tiempo de ejecución importantes al trabajar con mapas. Primero, leer una clave que nunca se estableció devuelve nil: el patrón clásico de conteo lo gestiona con or, convirtiendo lo «faltante» en 0:

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

Segundo, pairs() itera las claves de un mapa en un orden no garantizado: ejecutar el mismo programa dos veces puede recorrer las claves de manera diferente. Cuando la salida debe ser predecible, recopila las claves en un arreglo, aplica table.sort sobre ellas e itera el arreglo ordenado:

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 los objetos obtenidos con un mapa tipado.

  • Declara type Counts = {[string]: number}.
  • Escribe countItems(items: {string}): Counts que construya un mapa Counts nuevo y cuente 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 objeto distinto, en orden alfabético: recopila las claves, ordénalas con table.sort y después imprime.

Salida esperada:

potion: 3
shield: 1
sword: 2

Pruébalo tú mismo

-- Escribe el 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) recopila las keys, table.sort de ellas, 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

Practica por tu cuenta: Compilador de Lua online