Menu
Coddy logo textTech

Assinaturas de Índice

Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 72 de 73.

Você conheceu tipos de mapa como {[string]: number} no capítulo de tabelas — uma index signature: qualquer chave string mapeia para um valor number. Eles se destacam quando as chaves não são conhecidas enquanto você escreve o código: contadores, configurações, caches, pontuações — qualquer coisa construída em tempo de execução.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- qualquer chave string é permitida
counts["sword"] = 1
counts["potion"] += 1  -- os valores são verificados como números

Dois fatos em tempo de execução são importantes ao trabalhar com mapas. Primeiro, ler uma chave que nunca foi definida retorna nil — o padrão clássico de contagem lida com isso usando or, transformando missing em 0:

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

Segundo, pairs() itera as chaves de um mapa em ordem não garantida — executar o mesmo programa duas vezes pode visitar as chaves de forma diferente. Sempre que a saída precisar ser previsível, colete as chaves em um array, ordene-as com table.sort e itere o array ordenado em seu 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

Desafio

Fácil

Contar saques de itens com um mapa tipado.

  • Declare type Counts = {[string]: number}.
  • Escreva countItems(items: {string}): Counts que constrói um mapa Counts novo, contando quantas vezes cada string aparece (use o padrão (counts[item] or 0) + 1).
  • Crie local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} e conte-o.
  • Imprima uma linha [name]: [count] por item distinto, em ordem alfabética: colete as chaves, ordene-as com table.sort e depois imprima.

Saída esperada:

potion: 3
shield: 1
sword: 2

Experimente você mesmo

-- Escreva o código aqui
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts usando (counts[item] or 0) + 1
-- 3) conte o array loot da tarefa
-- 4) colete as chaves, table.sort nelas, imprima as linhas `{name}: {count}`
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Introdução ao Luau