📅  最后修改于: 2020-10-16 05:13:25             🧑  作者: Mango
模块就像可以使用require加载的库,并且具有包含表的单个全局名称。该模块可以包含许多功能和变量。所有这些函数和变量都包装在表中,该表用作名称空间。另外,行为良好的模块具有必要的规定,可根据需要返回此表。
在模块中使用表可以以多种方式帮助我们,并使我们可以像处理任何其他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
将模块和运行的文件都放在同一目录中。
模块名称及其文件名应该相同。
最好的做法是返回需要函数的模块,因此,即使您可以在其他地方找到其他类型的实现,也应该最好按照上述方式实现该模块。
现在让我以较旧的方式重写同一示例,该示例使用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)已弃用此方法。