📋 Tabelas

Estruturas de dados versáteis - use como arrays, dicionários ou objetos!

📦

O que são tabelas?

Tabelas são a ÚNICA estrutura de dados em Sol. Elas podem ser usadas como:

Criando tabelas

Array (lista)

local frutas = {"Maçã", "Banana", "Uva"}
exiba(frutas[1])  -- "Maçã" (índices começam em 1!)
exiba(frutas[2])  -- "Banana"

Dicionário (chave-valor)

local pessoa = {
    nome = "João",
    idade = 15,
    cidade = "São Paulo"
}
exiba(pessoa.nome)   -- "João"
exiba(pessoa["idade"])  -- 15 (acesso alternativo)

Tabela mista

local mista = {
    "primeiro",  -- índice 1
    "segundo",   -- índice 2
    nome = "Tabela",
    valor = 42
}

Acessar e modificar

local dados = {10, 20, 30}

-- Ler
exiba(dados[1])  -- 10

-- Modificar
dados[1] = 100
exiba(dados[1])  -- 100

-- Adicionar novo
dados[4] = 40
dados.novo = "valor"

Tamanho da tabela

local lista = {1, 2, 3, 4, 5}
exiba(#lista)  -- 5

Biblioteca Tabela

Criar tabela com tamanho pré-alocado

-- Criar tabela otimizada (sequencial, hash)
local t = tabela.crie(100, 10)  -- 100 elementos array, 10 hash

Inserir elementos

local lista = {1, 2, 3}

-- Inserir no final
tabela.insira(lista, 4)
-- lista = {1, 2, 3, 4}

-- Inserir em posição específica
tabela.insira(lista, 2, 99)
-- lista = {1, 99, 2, 3, 4}

Remover elementos

local lista = {10, 20, 30, 40}

-- Remover do final
local removido = tabela.remova(lista)
exiba(removido)  -- 40

-- Remover de posição específica
local removido = tabela.remova(lista, 2)
exiba(removido)  -- 20

Concatenar elementos

local palavras = {"Sol", "é", "legal"}
local frase = tabela.concatene(palavras, " ")
exiba(frase)  -- "Sol é legal"

local numeros = {1, 2, 3}
exiba(tabela.concatene(numeros, ", "))  -- "1, 2, 3"

Ordenar tabela

local numeros = {5, 2, 8, 1, 9}
tabela.ordene(numeros)
-- numeros = {1, 2, 5, 8, 9}

-- Ordenar com função customizada (decrescente)
tabela.ordene(numeros, função(a, b) retorne a > b fim)
-- numeros = {9, 8, 5, 2, 1}

Empacotar e desempacotar

-- Empacotar valores em tabela
local t = tabela.empacote(1, 2, 3, 4)
-- t = {1, 2, 3, 4, n=4}

-- Desempacotar tabela em valores
exiba(tabela.desempacote(t))  -- 1, 2, 3, 4
exiba(tabela.desempacote(t, 2, 3))  -- 2, 3 (intervalo)

Mover elementos

local origem = {1, 2, 3, 4, 5}
local destino = {10, 20, 30}

-- Mover elementos 2-4 de origem para posição 2 de destino
tabela.mova(origem, 2, 4, 2, destino)
-- destino = {10, 2, 3, 4, 30}

Iterar sobre tabelas

Array (com índices numéricos)

local frutas = {"Maçã", "Banana", "Uva"}

para indice, fruta em obtenha_pares_indexados(frutas) faça
    exiba(indice, fruta)
fim
-- 1 Maçã
-- 2 Banana
-- 3 Uva

Dicionário (todas as chaves)

local pessoa = {nome="Ana", idade=15, cidade="Rio"}

para chave, valor em obtenha_pares(pessoa) faça
    exiba(chave, valor)
fim

Metamétodos para Tabelas

Metamétodos permitem customizar o comportamento de tabelas:

__índice - Valores padrão

local padroes = {cor = "azul", tamanho = "médio"}
local config = {tamanho = "grande"}

defina_metatabela(config, {__índice = padroes})

exiba(config.tamanho)  -- "grande" (tem na tabela)
exiba(config.cor)      -- "azul" (busca no padrão)

__comprimento - Tamanho customizado

local tabela_especial = {a=1, b=2, c=3}

defina_metatabela(tabela_especial, {
    __comprimento = função(t)
        local count = 0
        para _ em obtenha_pares(t) faça
            count = count + 1
        fim
        retorne count
    fim
})

exiba(#tabela_especial)  -- 3

__soma - Somar tabelas

local Vetor = {}
Vetor.__índice = Vetor

função Vetor.novo(x, y)
    retorne defina_metatabela({x=x, y=y}, Vetor)
fim

função Vetor.__soma(a, b)
    retorne Vetor.novo(a.x + b.x, a.y + b.y)
fim

local v1 = Vetor.novo(3, 4)
local v2 = Vetor.novo(1, 2)
local v3 = v1 + v2
exiba(v3.x, v3.y)  -- 4, 6

Exemplo: Lista de tarefas

local tarefas = {}

função adiciona_tarefa(descricao)
    tabela.insira(tarefas, {
        descricao = descricao,
        concluida = falso
    })
fim

função lista_tarefas()
    para i, tarefa em obtenha_pares_indexados(tarefas) faça
        local status = tarefa.concluida e "✓" ou " "
        exiba(texto.formate("[%s] %d. %s", status, i, tarefa.descricao))
    fim
fim

adiciona_tarefa("Estudar Sol")
adiciona_tarefa("Fazer exercícios")
tarefas[1].concluida = verdadeiro

lista_tarefas()
-- [✓] 1. Estudar Sol
-- [ ] 2. Fazer exercícios
Tabelas são a estrutura de dados mais poderosa do Sol! Use-as para tudo: listas, objetos, classes e muito mais.
```