O assunto struct foi discutidos em Tutorial C: Struct.

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Simular struct de C
  2. Vetor de "struct"
  3. "struct" como parâmetro e retorno
  4. uso #
  5. Simulando "enum"

A linguagem Lua não possui o tipo de dado struct semelhante à outras linguagens com C , Go e Rust. Porém, com flexibilidade do tipo de dado table nos permite simular a idéia de do tipo de dado struct. com exceções.

Sintaxe
[local] nome_struct = {
  	membro1 = valor1,
	membro2 = valor2
	membroN = valorN
}
Exemplo 1
--simulação de struct anônima
local cidade1 = {
  id=1,
  nome="Shinjuku"
}

print(cidade1.id,var1.nome)
Saída
1	Shinjuku

Para utilizarmos "structs" com vetores é feita da mesma forma como os outros outros tipos de dados. Separamos as "structs" por (,) e delimitados por { e }. Para percorrer o conteúdo do vetor, utilizamos o comando for.

Exemplo 2
--simulação de struct 
local var1 = {
  id=1,
  nome="Shinjuku"
}

--simulação de struct 
local var2 = {
  id=2,
  nome="Akirabara"
}

--vetor structs
local vetor = { var1, var2 }

--exibindo informações de cada struct
for i=1,#vetor,1 do
  local var = vetor[i]
  print(var.id,var.nome)
end
Saída
1	Shinjuku
2	Akirabara

Podemos combinar funções anônimas e a simulação de struct em Lua para usar ponteiros para função em structs. O assunto ponteiro em C pode ser visto em Ponteiros em C.

Sintaxe
[local] nome_variavel = {
  	membro1 = nome_funcao
}
Exemplo 3
function funcao_qualquer(param)
  return param*2;
end

local var1 = {
  id=1,
  nome="Shinjuku",
  funcao = funcao_qualquer --ponteiro p/ função
}

print(var1.id,var1.nome,var1.funcao(2))
Saída
4

O uso de "struct" como parâmetro e retorno é feita da mesma forma como outros tipos de dados já vistos.

Sintaxe
[local] nome_funcao(parametro_struct)
    return nome_variavel_struct
end
Exemplo 4
local var1 = {
  id=1,
  nome="Shinjuku",
}

function funcao1(param)
  print(param.id,param.nome)
end

function funcao2()
  local var1 = {  id=1,  nome="Shinjuku"}
  return var1
end

funcao1(var1)
retorno = funcao2()
print(retorno.id,retorno.nome)
Saída
1	Shinjuku
1	Shinjuku

Lua não possui suporte nativo à declaração de enumerador. A simulação pode ser feita, assim como "struct", com o uso de tipo table como mostrado na sintaxe abaixo:

Sintaxe
nome_enumerador = 
{
  nome_membro1 = valor_constante1
  nome_membro2 = valor_constante2
  nome_membroN = valor_constanteN
}
Exemplo 5
meu_enum =  --enumerador
{ 
  OPCAO0 = 0,
  OPCAO1 = 1,
  OPCAO2 = 2,
  OPCAO3 = -1
}
--atribuição
local opcao = meu_enum.OPCAO1
print(opcao)

--verificação
if(opcao == meu_enum.OPCAO1) then
  print(opcao)
end
Saída
1
1

Tables também podem ser utilizadas como valores associados a membros de "enumeradores" como pode ser observado no exemplo abaixo. Nesse, definimos um valor constante e um nome:

Exemplo 6
local meu_enum = 
{ 
  OPCAO0 = {0, "OPCAO0"}, --table
  OPCAO1 = {1, "OPCAO1"},
  OPCAO2 = {2, "OPCAO2"},
  OPCAO3 = {3, "OPCAO3"}
}

--atribuição
local opcao = meu_enum.OPCAO1

--verificação
if(opcao == meu_enum.OPCAO1) then
   valor, nome = table.unpack(opcao) --valores do membro
   print(valor, nome) 
end
Saída
1	OPCAO1
  1. 11/12/2025 - revisão 5 - Adição: Simulando "enum"
  2. 15/09/2025 - revisão 4 - Ajustes: pontuais, sintaxes, target de links internos, objetivos e tab. funções
  3. 12/09/2024 - revisão 2 - Adição de sintaxe "struct" e função", ajustes gramaticais gerais
  4. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais
  5. 26/05/2023 - versão inicial