🔄 Repetições e Iterações
Faça o computador repetir coisas automaticamente!
🔄Tabela de Referência Rápida
| Tipo | Sintaxe | Retorna | Quando usar |
|---|---|---|---|
| Numérico simples | para i = 1, 10 faça |
contador | Contar de X até Y |
| Numérico com passo | para i = 0, 100, 10 faça |
contador | Pular valores (de 10 em 10) |
| Regressivo | para i = 10, 1, -1 faça |
contador | Contagem regressiva |
| Array/Lista | para i, v em obtenha_pares_indexados(t) faça |
índice, valor | Listas ordenadas {1, 2, 3} |
| Mapa/Objeto | para k, v em obtenha_pares(t) faça |
chave, valor | Dicionários {nome="Ana"} |
Sintaxe do PARA
Forma numérica
para variável = início, fim [, passo] faça
-- código a repetir
fim
| Parte | Obrigatório? | Descrição |
|---|---|---|
variável | ✅ Sim | Nome do contador (geralmente i) |
início | ✅ Sim | Valor inicial do contador |
fim | ✅ Sim | Valor final (inclusivo) |
passo | ❌ Opcional | Incremento (padrão: 1) |
Forma genérica (iteradores)
para variável1 [, variável2, ...] em iterador(tabela) faça
-- código a repetir
fim
| Parte | Obrigatório? | Descrição |
|---|---|---|
variável1 | ✅ Sim | Primeira variável retornada pelo iterador |
variável2 | ❌ Opcional | Segunda variável (e mais, se o iterador retornar) |
iterador | ✅ Sim | Função que gera os valores (obtenha_pares, obtenha_pares_indexados, etc.) |
💡 Se você não precisa de uma variável, use
_ (sublinhado) para ignorá-la:
para _, valor em obtenha_pares_indexados(lista) faça
Iteração Numérica
Contagem simples
-- Conta de 1 até 5
para i = 1, 5 faça
exiba(i)
fim
-- Resultado: 1, 2, 3, 4, 5
Contagem com passo
-- De 0 a 100, pulando de 10 em 10
para i = 0, 100, 10 faça
exiba(i)
fim
-- Resultado: 0, 10, 20, 30, ..., 100
Contagem regressiva
-- De 5 até 1 (passo negativo!)
para i = 5, 1, -1 faça
exiba(i)
fim
exiba("🚀 Decolar!")
-- Resultado: 5, 4, 3, 2, 1, 🚀 Decolar!
⚠️ Passo obrigatório para regressiva: Se o início for maior que o fim, você deve especificar um passo negativo, senão o loop não executa!
Entendendo Tabelas em Sol
Em Sol, tabelas são a única estrutura de dados. Mas elas podem ser usadas de várias formas:
| Uso | Exemplo | Característica |
|---|---|---|
| Array/Lista | {"a", "b", "c"} |
Índices numéricos: 1, 2, 3... |
| Mapa/Dicionário | {nome="Ana", idade=15} |
Chaves nomeadas |
| Objeto | {dados={}, metodo=função() fim} |
Dados + funções |
| Mista | {"item1", nome="teste"} |
Índices + chaves |
A forma de iterar depende de como você está usando a tabela:
Iteradores: Quando usar cada um
obtenha_pares_indexados() — Para Arrays/Listas
Use quando sua tabela é uma lista ordenada com índices numéricos (1, 2, 3...):
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
Características:
- ✅ Itera em ordem (1, 2, 3...)
- ✅ Para no primeiro
nuloencontrado - ❌ Ignora chaves nomeadas
obtenha_pares() — Para Mapas/Objetos
Use quando sua tabela tem chaves nomeadas ou você precisa ver tudo:
local pessoa = {nome = "Ana", idade = 15, cidade = "São Paulo"}
para chave, valor em obtenha_pares(pessoa) faça
exiba(chave .. " = " .. converta_para_texto(valor))
fim
-- nome = Ana
-- idade = 15
-- cidade = São Paulo
Atenção:
obtenha_pares() não garante ordem! A ordem de iteração pode variar.
Comparação Visual
local mista = {
"primeiro", -- índice 1
"segundo", -- índice 2
nome = "Tabela", -- chave nomeada
valor = 42 -- chave nomeada
}
exiba("--- obtenha_pares_indexados ---")
para i, v em obtenha_pares_indexados(mista) faça
exiba(i, v)
fim
-- 1 primeiro
-- 2 segundo
-- (chaves nomeadas ignoradas!)
exiba("--- obtenha_pares ---")
para k, v em obtenha_pares(mista) faça
exiba(k, v)
fim
-- 1 primeiro
-- 2 segundo
-- nome Tabela
-- valor 42
-- (tudo, mas sem ordem garantida)
Cenários Práticos
Lista de compras (Array)
local compras = {"Pão", "Leite", "Ovos"}
para i, item em obtenha_pares_indexados(compras) faça
exiba(i .. ". [ ] " .. item)
fim
-- 1. [ ] Pão
-- 2. [ ] Leite
-- 3. [ ] Ovos
Ficha de cadastro (Mapa)
local usuario = {
nome = "João Silva",
email = "joao@email.com",
ativo = verdadeiro
}
exiba("=== Dados do Usuário ===")
para campo, valor em obtenha_pares(usuario) faça
exiba(campo .. ": " .. converta_para_texto(valor))
fim
Calcular média (Array numérico)
local notas = {8, 7, 9, 6, 10}
local soma = 0
para _, nota em obtenha_pares_indexados(notas) faça
soma = soma + nota
fim
local media = soma / #notas
exiba("Média: " .. media) -- Média: 8
Tabuada (Numérico simples)
local numero = 7
exiba("Tabuada do " .. numero)
para i = 1, 10 faça
exiba(numero .. " x " .. i .. " = " .. (numero * i))
fim
Controlando o Loop
Interromper o loop (interrompa)
local numeros = {1, 2, 3, 4, 5}
para _, n em obtenha_pares_indexados(numeros) faça
se n == 3 então
exiba("Encontrei o 3! Parando.")
interrompa
fim
exiba(n)
fim
-- 1
-- 2
-- Encontrei o 3! Parando.
Atenção: Por questões de performance e design, não é permitido colocar um loop
para dentro de outro para.
Se precisar fazer isso, isole o loop interno em uma função separada.
Erros Comuns
| ❌ Erro | ✅ Correto | Por quê? |
|---|---|---|
para i = 10, 1 faça |
para i = 10, 1, -1 faça |
Falta o passo negativo |
para k em obtenha_pares(t) faça |
para k, v em obtenha_pares(t) faça |
obtenha_pares retorna 2 valores |
Usar obtenha_pares_indexados em mapa |
Usar obtenha_pares |
Chaves nomeadas são ignoradas |
Usar obtenha_pares + esperar ordem |
Usar obtenha_pares_indexados |
obtenha_pares não garante ordem |
🎉 Agora você domina iterações em Sol! Use
obtenha_pares_indexados para listas e obtenha_pares para mapas/objetos.