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

Sintaxe
escopo_funcao function nome_funcao ( argumento1, argumento2, argumentoN) 
	--corpo da função
	return valor_retorno
end
Onde
escopo_funcao: Se a função será interna(local) ao módulo ou não(Global).
nome_funcao: nome da função
argumento1…N: argumentos da função
valor_retorno: Valor a ser retornado caso seja necessário.
Exemplo 1
local function funcao1(v1,v2)
  print(v1,v2)
end

function funcao2(v1,v2)
  print(v1,v2)
end
Saída
-

Diferente de outras linguagens, não precisamos informar o tipo de dados de retorno e nem mesmo os tipos de dados utilizados pelos parâmetros ao declararmos uma função. Esse processo é feito internamente.

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("string")
end

funcao1()
Saída
string

O uso de parâmetros em funções escritas na linguagem Lua seguem o mesmo padrão de linguagens da família C Para isso declararmos os parâmetros desejados separados por (,).

Sintaxe
function nome_funcao(param1, param2, paramN)
  --uso dos parametros
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 definirmos valores padrão para os parâmetros de uma função. No início do corpo da função devemos declarar um valor default de acordo com o exemplo abaixo:

Sintaxe
function funcao(nome_parametro)
    nome_parametro = nome_parametro or valor_default
    --corpo omitido
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.

Exemplo 5

function funcao(param1,param2)
  if( type(param1) == "string") then
    print("param1:",type(param1))
  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 na linguagem Lua podem retornar mais de um valor como em outras linguagens como Go e Rust. O retorno de múltiplos valores em Lua é muito mais simples, basta separarmos os valores que desejamos retornar separados por (,).

Exemplo 5
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

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 () conhecido também como vararg.

Sintaxe
function nome_funcao(...)
--corpo
end
Exemplo 6
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 7
function funcao(...)
  local var = {...}  --empacotando varargs em um vetor
 
  --percorrer vetor
  for i=1,#var,1 do --índice inicial 1
    print(var[i])
  end
end
Saída
1
2
3
4
5
  1. 12/09/2024 - revisão 2 - Ajustes em todos os tópicos
  2. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais, correção em sintaxe e exemplos
  3. 26/05/2023 - versão inicial