Menu
CoddyTech

Firmas de índice

Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 78 de 80.

Ya conociste tipos de mapa como {[string]: number} en el capítulo sobre tablas: una firma de índice: cualquier clave de tipo string corresponde a un valor de tipo number. Son útiles cuando no se conocen las claves mientras escribes el código: contadores, ajustes, cachés, puntuaciones; cualquier cosa que se construya durante la 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  -- se comprueba que los valores sean números

Hay dos hechos sobre el tiempo de ejecución que importan al trabajar con mapas. Primero, leer una clave que nunca se asignó devuelve nil: el patrón clásico para contar lo resuelve con or, convirtiendo «ausente» en 0:

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

Segundo, pairs() itera por las claves de un mapa sin un orden garantizado: al ejecutar el mismo programa dos veces, las claves pueden recorrerse en un orden distinto. Siempre que la salida deba ser predecible, reúne las claves en un array, aplícales table.sort e itera por el array 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

Guarda las puntuaciones de jugadores cuyos nombres no conoces de antemano.

  1. Escribe type Scores = {[string]: number} y crea local scores: Scores = {}.
  2. Añade puntos: scores["mia"] = (scores["mia"] or 0) + 5, después haz lo mismo con "leo" y 3.
  3. Imprime scores["mia"], scores["leo"] y scores["zed"].

Pulsa Ejecutar código: la salida muestra 5, 3 y nil.

Pruébalo tú mismo

-- 1) type Scores = {[string]: number}, luego local scores: Scores = {}
-- 2) añade 5 puntos para "mia" y 3 para "leo"
-- 3) imprime mia, leo y zed

Todas las lecciones de Introducción a Luau

Practica por tu cuenta: Compilador de Luau online