上一节:
下一节:

  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   
    
    现在,为了在另一个文件中访问这个 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)已弃用此功能。
上一节:
下一节: