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中的编程是如何灵活的,没有任何特殊的附加代码.

require函数

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

现在,为了在另一个文件中访问这个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

要记住的事情

  • 放置两者您在同一目录中运行的模块和文件.

  • 模块名称及其文件名应相同.

  • 最佳实践是返回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已经弃用了这个.