Lua - Módulos

O que é um módulo?

O módulo é como uma biblioteca que pode ser carregada usando require e tem um único nome global contendo uma tabela. Este módulo pode consistir em várias funções e variáveis. Todas essas funções e variáveis ​​são agrupadas na tabela, que atua como um namespace. Além disso, um módulo bem comportado tem as disposições necessárias para retornar esta tabela quando necessário.

Especialidade de Módulos Lua

O uso de tabelas em módulos nos ajuda de várias maneiras e nos permite manipular os módulos da mesma forma que manipulamos qualquer outra tabela Lua. Como resultado da capacidade de manipular módulos, ele fornece recursos extras para os quais outras linguagens precisam de mecanismos especiais. Devido a esse mecanismo livre de módulos em Lua, um usuário pode chamar as funções em Lua de várias maneiras. Alguns deles são mostrados abaixo.

-- Assuming we have a module printFormatter
-- Also printFormatter has a funtion simpleFormat(arg)
-- Method 1
require "printFormatter"
printFormatter.simpleFormat("test")

-- Method 2
local formatter = require "printFormatter"
formatter.simpleFormat("test")

-- Method 3
require "printFormatter"
local formatterFunction = printFormatter.simpleFormat
formatterFunction("test")

No código de exemplo acima, você pode ver como a programação em Lua é flexível, sem nenhum código adicional especial.

A função require

Lua forneceu uma função de alto nível chamada require para carregar todos os módulos necessários. É mantido o mais simples possível para evitar ter muitas informações sobre o módulo para carregá-lo. A função require apenas assume os módulos como um pedaço de código que define alguns valores, que na verdade são funções ou tabelas contendo funções.

Exemplo

Vamos considerar um exemplo simples, onde uma função tem as funções matemáticas. Vamos chamar esse módulo de mymath e o nome de arquivo como mymath.lua. O conteúdo do arquivo é o seguinte -

local mymath =  {}

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

return mymath

Agora, para acessar este módulo Lua em outro arquivo, digamos, moduletutorial.lua, você precisa usar o seguinte segmento de código.

mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)

Para executar este código, precisamos colocar os dois arquivos Lua no mesmo diretório ou, alternativamente, você pode colocar o arquivo do módulo no caminho do pacote e ele precisa de configuração adicional. Quando executamos o programa acima, obteremos a seguinte saída.

30
10
200
1.5

Coisas para lembrar

  • Coloque os módulos e o arquivo que você executa no mesmo diretório.

  • O nome do módulo e seu nome de arquivo devem ser iguais.

  • É uma prática recomendada retornar módulos para a função necessária e, portanto, o módulo deve ser preferencialmente implementado conforme mostrado acima, embora você possa encontrar outros tipos de implementações em outro lugar.

Antiga maneira de implementar módulos

Deixe-me agora reescrever o mesmo exemplo da maneira mais antiga, que usa o tipo de implementação package.seeall. Isso foi usado nas versões 5.1 e 5.0 da Lua. O módulo mymath é mostrado abaixo.

module("mymath", package.seeall)

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

O uso de módulos em moduletutorial.lua é mostrado abaixo.

require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)

Quando executarmos o procedimento acima, obteremos a mesma saída. Mas é aconselhável usar a versão mais antiga do código e é considerado menos seguro. Muitos SDKs que usam Lua para programação, como o Corona SDK, tornaram seu uso obsoleto.