Lua 模块
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中有多么灵活的编程方式,没有任何特殊的附加代码。
require函数
Lua提供了一个称为require高级函数,它可以简单地加载所有必要模块,。require函数只是假定模块作为一个代码块,它定义了一些实际上是函数或包含函数的表。
例子
让我们看一个简单的例子,其中一个函数具有数学函数。让我们将此模块称为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
现在,为了在另一个文件中访问这个Lua模块,比如说moduletutorial.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类型的实现。这在Lua5.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 tutorial.lua中模块的使用情况如下所示: require("mymath") mymath.add(10,20) mymath.sub(30,20) mymath.mul(10,20) mymath.div(30,20)
当我们运行上面的时候,我们将得到相同的输出。但是它被建议弃用的旧版本代码,它被认为不太安全。许多基于Lua的SDK如Corona SDK已不赞成使用这一点。