📋 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:
- Arrays: Listas ordenadas [1, 2, 3]
- Dicionários: Pares chave-valor {nome="Ana", idade=15}
- Objetos: Com métodos e propriedades
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.