0Pricing
Lua Academy · Aula

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  2

Ajustando 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  2

Parê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)           -- 10

Valores 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.75

Capturando 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])        -- true

table.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  7

Retornos 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)
end

Troca 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  2

Convençã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 input

Verificaçã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 valor
  • table.pack/table.unpack para listas dinâmicas de valores
  • Convenção: retorne nil, errmsg em 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

  1. Definição e chamada de funções
  2. Múltiplos valores de retorno
  3. Argumentos variáveis e o operador ...
  4. Recursão em Lua
← Voltar para Lua Academy