Lua - 模块


什么是模块?

模块就像一个可以使用require加载的库,并且具有包含表的单个全局名称。该模块可以由许多函数和变量组成。所有这些函数和变量都包装在表中,该表充当命名空间。此外,一个表现良好的模块有必要的规定来根据需要返回该表。

Lua模块的特殊性

在模块中使用表可以在很多方面帮助我们,并使我们能够像操作任何其他 Lua 表一样操作模块。由于能够操作模块,它提供了其他语言需要特殊机制的额外功能。由于Lua中模块的这种自由机制,用户可以通过多种方式调用Lua中的函数。下面显示了其中的一些。

-- 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")

在上面的示例代码中,您可以看到Lua编程是多么灵活,无需任何特殊的额外代码。

需要的函数

Lua 提供了一个名为require的高级函数来加载所有必需的模块。它尽可能简单,以避免模块上有太多信息来加载它。require 函数只是假设模块是定义一些值的代码块,这些值实际上是函数或包含函数的表。

例子

让我们考虑一个简单的例子,其中一个函数具有数学函数。我们将此模块命名为 mymath,文件名为 mymath.lua。文件内容如下 -

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	

现在,为了在另一个文件(例如 moduletutorial.lua)中访问此 Lua 模块,您需要使用以下代码段。

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

为了运行此代码,我们需要将两个 Lua 文件放在同一目录中,或者,您可以将模块文件放在包路径中,它需要额外的设置。当我们运行上面的程序时,我们将得到以下输出。

30
10
200
1.5

要记住的事情

  • 将模块和运行的文件放在同一目录中。

  • 模块名称与其文件名应该相同。

  • 最佳实践是返回 require 函数的模块,因此该模块最好按照上面所示的方式实现,即使您可以在其他地方找到其他类型的实现。

实现模块的旧方法

现在让我以旧的方式重写相同的示例,它使用 package.seeall 类型的实现。这在 Lua 5.1 和 5.0 版本中使用。mymath 模块如下所示。

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

moduletutorial.lua中模块的使用如下所示。

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

当我们运行上面的代码时,我们将得到相同的输出。但建议使用旧版本的代码,并且认为它的安全性较低。许多使用 Lua 进行编程的 SDK(例如 Corona SDK)已弃用这种方式。