Para "quebrarmos" nossos programas em partes menores para organização e reuso, criamos funções. Em Lua, a declaração de função segue a sintaxe abaixo:

Sintaxe
escopo_funcao function nome_funcao() 
    --corpo
end
Onde
escopo_funcao: Se a função será interna(local) ao módulo ou não(Global).
Exemplo 1
local function funcao1()
  print("funcao1")
end
Saída
-

Uma função em Lua deve sempre ser declarada antes de ser chamada. Caso contrário, um erro de compilação será gerado.

A chamada de funções em Lua é semelhante as outras linguagens de programação. Basta invocar a função pelo seu nome:

Exemplo 2
local function funcao1()
  print("funcao1")
end

funcao1()
Saída
funcao1

Em Lua declaramos os parâmetros de uma função de acordo com a sintaxe mostrada abaixo: de dado:

Sintaxe
escopo_funcao function nome_funcao(param1, ... , paramN)
  --corpo
end
Onde
parm1…paramN: lista de parâmetros
Exemplo 3
function funcao(param1,param2)
  print(param1)
  print(param2)
end

funcao(1,"string")
Saída
1
string

É possível definir um valor padrão para um parâmetro de uma função. Na primeira linha do corpo da função, declaramos a atribuição de um valor default ao parâmetro como abaixo:

Sintaxe
escopo_funcao function nome_funcao(<nome_parametro>)
    <nome_parametro> = <nome_parametro> or valor_default
    --corpo
end
Exemplo 4
function funcao(param1,param2)
  param1 = param1 or "fulano"
  param2 = param2 or 1
  
  print(string.format("Olá %s",param1))
  print(param2)
end

funcao("Luna")
Saída
Olá Luna
1

Com valores padrão, caso nenhum parâmetro for informado ao invocarmos uma função, o compilador não irá gerar nenhum tipo de erro.

Caso seja necessário, podemos utilizar a função type para realizar a checagem do tipo de dado passado como argumento para uma função.

Sintaxe: type
type(nome_parametro)
Sintaxe
if ( type(nome_parametro ) then
   -- código
end
Exemplo 5
function funcao(param1,param2)
  if( type(param1) == "string") then
    print("param1:","string")
  end  
end

funcao("Luna")
Saída
param1:	string

Se nenhum parâmetro for informado ao invocarmos uma função, é necessário verificar se o parâmetro é nil.

O retorno de valores de funções em Lua é feito de forma mais simples comparado a outras linguagens. Não precisamos declarar o tipo de dados que a função irá retornar, apenas é necessário utilizar o comando return.

Sintaxe
return valor
Exemplo 6
function funcao1(v1,v2)
  return v1 + v2
end

local soma = funcao1(1,2)
print(soma)

As funções escritas em Lua podem retornar mais de um valor como em linguagens como Go e Rust. Para retornar de múltiplos valores em Lua, basta separar os valores por (,).

Sintaxe
return valor1, valor2, valorN
Exemplo 7
function funcao()
    return 1,'C',1.99,"string";
end

local a,b,c,d = funcao()

print(a)
print(b)
print(c)
print(d)
Saída
1
C
1.99
string

Com os comandos de decisão if ou if-elseif podemos utilizar o comando return uma ou mais vezes ao longo do corpo da função:

Exemplo 8
local x

function funcao(param)
  
  if( param%2 == 0) then
      return true
  end
  return false
end

print(funcao(2))
Saída
true

Quando aprendemos a função print para a exibição de informações, podemos perceber que essa função recebe um número de argumentos variável. Para que nossas funções possam ter o comportamento semelhante, utilizamos o operador () chamado de vararg.

Sintaxe
escopo_funcao function nome_funcao(...)
    --corpo
end
Exemplo 9
function funcao(...)
  print(...) --impressão de argumento
end

--passando argumentos
funcao(1,2,3,4,5)
Saída
1	2	3	4	5

Para descobrirmos o número de argumento passadas para as nossas funções que utilizam () podemos converter os argumentos em um vetor e utilizar o operador #.

Exemplo 10
function funcao(...)
  local var = {...}  --"empacotando" varargs em um vetor
 
  --percorrer vetor
  for i=1,#var,1 do --i=1 índice inicial 
    print(var[i])
  end
end
Saída
1
2
3
4
5

Quando declaramos uma função, seu retorno pode ser definido como sem retorno. Mesmo assim declarada, podemos utilizar o comando return, sem valor de retorno, para sair dessa função a qualquer momento.

Exemplo 10
function funcao(param)
  if(param&1 ~= 0) then
    return
  end
  print(param) --else
end
Saída
2

Como pode ser observado acima, não precisamos declarar uma bloco de código else, pois o comando if retorna da função.

Lua fornece a característica Função local ou interna. Esse tipo de função pode ser declarada dentro de outra função possibilitando um certo nível de encapsulamento(POO) ou visibilidade.

Uma função local possui as mesmas características de uma função comum já vista, exceto pelo escopo local para ser invocada, por exemplo.

Exemplo 11
var_global = 10 

function funcao(param1, param2) --principal

  local var_local = 2;
  
  function funcao_interna(parametro)  --função local
    return parametro*var_local*var_global --uso de var local e global
  end
  
  print(param1, funcao_interna(param2)) --chamada local
  
end

funcao(2,3)
Saída
2    60
  1. 11/12/2025 - revisão 4 - Adição: função local e função sem retorno com return
  2. 15/09/2025 - revisão 3 - Ajustes: 'funções' reescrita, pontuais, sintaxes e objetivos; Adição: Ex. 8 e sintaxe retorno múltiplo
  3. 12/09/2024 - revisão 2 - Ajustes em todos os tópicos
  4. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais, correção em sintaxe e exemplos
  5. 26/05/2023 - versão inicial