Módulo Table
O módulo table estende as funcionalidades padrão de manipulação de tabelas do Lua, fornecendo funções adicionais úteis para processamento de dados. Este módulo complementa as funções nativas da tabela table do Lua, adicionando operações comuns que não estão disponíveis na biblioteca padrão.
Características principais:
- Extensão da tabela
tablenativa do Lua - Funções otimizadas para performance
Funções Disponíveis
1. table.contains(tabela, valor)
Verifica se um valor específico está presente em uma tabela Lua.
Parâmetros:
- tabela (tabela): A tabela a ser verificada (pode ser array ou tabela associativa)
- valor (qualquer tipo Lua): O valor a ser procurado na tabela
Retorno:
-
boolean:
truese o valor for encontrado na tabela,falsecaso contrário
Comportamento:
- Percorre todos os pares chave-valor da tabela usando
pairs() - Compara cada valor com o valor procurado usando igualdade estrita (
==) - Retorna
truena primeira ocorrência encontrada - Retorna
falsese percorrer toda a tabela sem encontrar o valor - Funciona com tabelas indexadas numericamente (arrays) e tabelas associativas
Exemplo de Uso:
-- Verificar se um valor existe em um array
local frutas = {"maçã", "banana", "laranja", "uva"}
local tem_banana = table.contains(frutas, "banana")
print("Tem banana?", tem_banana) -- true
local tem_morango = table.contains(frutas, "morango")
print("Tem morango?", tem_morango) -- false
-- Verificar em tabela associativa
local configuracoes = {
timeout = 30,
retries = 3,
debug = false,
hostname = "servidor.local"
}
local tem_timeout = table.contains(configuracoes, 30)
print("Tem valor 30?", tem_timeout) -- true
local tem_true = table.contains(configuracoes, true)
print("Tem valor true?", tem_true) -- false
-- Verificar tipos complexos
local usuarios = {
{id = 1, nome = "Alice", ativo = true},
{id = 2, nome = "Bob", ativo = false},
{id = 3, nome = "Carol", ativo = true}
}
-- Para tipos complexos, precisa ser a mesma referência
local usuario_bob = usuarios[2]
local encontrou_bob = table.contains(usuarios, usuario_bob)
print("Encontrou Bob?", encontrou_bob) -- true
-- Esta busca retornará false porque é um novo objeto
local encontrou_novo_bob = table.contains(usuarios, {id = 2, nome = "Bob", ativo = false})
print("Encontrou novo Bob?", encontrou_novo_bob) -- false
2. table.slice(tabela, primeiro, último)
Extrai uma fatia (subarray) de uma tabela indexada numericamente (array).
Parâmetros:
- tabela (tabela): O array Lua do qual extrair a fatia
- primeiro (número, opcional): Índice inicial da fatia (padrão: 1)
- último (número, opcional): Índice final da fatia (padrão: comprimento da tabela)
Retorno:
- tabela: Novo array contendo os elementos da fatia especificada
Comportamento:
- Cria uma nova tabela contendo os elementos do índice
primeiroatéúltimo(inclusive) - Se
primeirofor omitido ounil, começa do primeiro elemento (índice 1) - Se
últimofor omitido ounil, vai até o último elemento da tabela - Se
primeirofor maior queúltimo, a função ainda itera mas os valores serãonilpara índices inexistentes - Não realiza verificação de limites - índices fora do intervalo da tabela resultarão em valores
nil - Preserva a ordem original dos elementos
Exemplo de Uso:
-- Extrair parte de um array
local numeros = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}
-- Fatia do índice 3 ao 7
local fatia1 = table.slice(numeros, 3, 7)
-- fatia1 = {30, 40, 50, 60, 70}
-- Fatia do início até o índice 5
local fatia2 = table.slice(numeros, nil, 5)
-- fatia2 = {10, 20, 30, 40, 50}
-- Fatia do índice 8 até o final
local fatia3 = table.slice(numeros, 8)
-- fatia3 = {80, 90, 100}
-- Fatia com índices fora dos limites
local fatia4 = table.slice(numeros, -2, 15)
-- fatia4 = {nil, nil, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, nil, nil, nil, nil, nil} (não trata limites)
-- Fatia com primeiro > último
local fatia5 = table.slice(numeros, 5, 3)
-- fatia5 = {50, 40, 30} (itera em ordem decrescente)
-- Processamento de dados em lotes
local function processar_em_lotes(dados, tamanho_lote)
local lotes = {}
local total = #dados
for i = 1, total, tamanho_lote do
local fim = math.min(i + tamanho_lote - 1, total)
local lote = table.slice(dados, i, fim)
table.insert(lotes, lote)
end
return lotes
end
local dados_grandes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
local lotes = processar_em_lotes(dados_grandes, 5)
-- lotes = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}}