模块是一个可以使用require
加载的库,并且只有一个包含表的全局名称。 模块可以包含许多功能和变量。 所有这些函数和变量都包含在表中,表充当命名空间。 此外,一个良好的模块有必要的子句,以在使用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
注意事项
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都不推荐使用它。