Múltiplos valores de retorno
Retorne e capture vários valores em uma única chamada de função.
Múltiplos valores de retorno é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Retornando Vários Valores
Ao contrário da maioria das linguagens, as funções de Lua podem retornar nativamente vários valores a partir de uma única instrução return. Os vários valores são separados por vírgulas após return. Isso elimina a necessidade de objetos contêiner ou parâmetros de saída.
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2Ajustando Valores de Retorno
Lua ajusta os valores de retorno para corresponder à quantidade de variáveis receptoras. Os valores extras são descartados; os valores ausentes tornam-se nil. Esse ajuste ocorre sempre que uma chamada de função não é a última expressão de uma lista — nessa posição, somente o primeiro valor é mantido.
local function triple()
return 10, 20, 30
end
local a, b, c = triple()
print(a, b, c) -- 10 20 30
local x, y = triple()
print(x, y) -- 10 20 (30 discarded)
local p = triple()
print(p) -- 10 (only first when 1 var)Ajuste na Posição Intermediária
Quando uma chamada de função aparece no meio de uma lista de expressões (e não na última posição), Lua a reduz a um único valor. Somente a última expressão da lista pode produzir vários valores.
local function pair()
return 1, 2
end
-- pair() in middle: only 1 value used
local t = {pair(), pair()}
print(#t, t[1], t[2], t[3]) -- 3 1 1 2
-- first pair() gives just 1; last pair() gives 1,2
-- pair() at end: all values used
local t2 = {10, pair()}
print(#t2, t2[1], t2[2], t2[3]) -- 3 10 1 2Parênteses Forçam um Único Valor
Colocar uma chamada de função entre parênteses força-a a retornar exatamente um valor. Isso é útil quando você quer somente o primeiro valor de retorno, independentemente de quantos valores a função produza.
local function coords()
return 10, 20, 30
end
print(coords()) -- 10 20 30 (all three)
print((coords())) -- 10 (parentheses: single value only)
local x = (coords())
print(x) -- 10Valores Retornados por string.find
Muitas funções da biblioteca padrão usam vários valores de retorno. string.find retorna as posições inicial e final de uma correspondência (além das capturas). math.modf retorna as partes inteira e fracionária. Entender esses padrões ajuda você a usar a biblioteca padrão com fluência.
local s = "hello world"
local start, finish = string.find(s, "world")
print(start, finish) -- 7 11
-- math.modf: integer and fractional parts
local int, frac = math.modf(3.75)
print(int, frac) -- 3 0.75Capturando com table.pack
table.pack(...) captura todos os argumentos (ou valores de retorno por meio de ...) em uma tabela. A tabela inclui um campo n com a quantidade total, incluindo valores nil. Isso preserva a quantidade exata, ao contrário de #, que para no primeiro espaço vazio.
local function getData()
return "Alice", 30, nil, true
end
local t = table.pack(getData())
print(t.n) -- 4
print(t[1]) -- Alice
print(t[2]) -- 30
print(t[3]) -- nil
print(t[4]) -- truetable.unpack para Espalhar Valores
table.unpack(t, i, j) retorna os elementos de uma tabela como valores individuais. Essa função é o inverso de table.pack. Use-a para passar o conteúdo de uma tabela como argumentos para uma função ou para espalhar valores em uma instrução de retorno.
local args = {10, 20, 30}
local function sum3(a, b, c)
return a + b + c
end
print(sum3(table.unpack(args))) -- 60
-- Use in return
local function passThrough(t)
return table.unpack(t)
end
print(passThrough({5, 6, 7})) -- 5 6 7Retornos no Estilo de Erro
Uma convenção comum em Lua é retornar nil, errorMessage em caso de falha e o resultado em caso de sucesso. Quem chama a função verifica o primeiro valor de retorno: se for nil, ocorreu um erro. Isso evita exceções em casos de falha esperados.
local function openConfig(path)
local f = io.open(path, "r")
if not f then
return nil, "cannot open: " .. path
end
local content = f:read("*a")
f:close()
return content
end
local data, err = openConfig("config.lua")
if not data then
print("Error:", err)
endTroca com Vários Valores de Retorno
Vários valores de retorno resolvem o problema da troca de forma elegante. O lado direito é avaliado antes da atribuição, portanto a, b = b, a troca os valores corretamente sem uma variável temporária.
local a, b = 5, 10
print(a, b) -- 5 10
a, b = b, a
print(a, b) -- 10 5
-- Works for three-way rotation too
local x, y, z = 1, 2, 3
x, y, z = z, x, y
print(x, y, z) -- 3 1 2Convenção de Retorno de pcall
pcall(f, ...) também usa vários valores de retorno: o primeiro é um booleano (true em caso de sucesso, false em caso de erro), e os valores seguintes são os valores retornados por f ou a mensagem de erro. Verifique sempre o primeiro retorno antes de usar os demais.
local function risky(x)
if x < 0 then error("negative input") end
return math.sqrt(x)
end
local ok, result = pcall(risky, 16)
print(ok, result) -- true 4.0
ok, result = pcall(risky, -1)
print(ok, result) -- false input:2: negative inputVerificação Rápida
O que print((string.find("hello", "ll"))) exibe?
Recapitulação: Vários Valores de Retorno
Principais conclusões:
- Retorne vários valores:
return a, b, c - Os valores extras são descartados; os ausentes tornam-se nil
- As chamadas em posição intermediária são reduzidas a 1 valor
(f())força exatamente 1 valortable.pack/table.unpackpara listas dinâmicas de valores- Convenção: retorne
nil, errmsgem caso de falha
Perguntas Frequentes
A aula “Múltiplos valores de retorno” é grátis?
Sim — o texto completo de “Múltiplos valores de retorno” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Múltiplos valores de retorno”?
Retorne e capture vários valores em uma única chamada de função. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Múltiplos valores de retorno”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definição e chamada de funções
- Múltiplos valores de retorno
- Argumentos variáveis e o operador ...
- Recursão em Lua