[✔️]lua中的module函数

669 阅读4分钟

module函数

在 Lua 5.1 版本中,module 函数用于创建一个模块。在 Lua 5.2 及以上版本中,这个函数已经被废弃了,可以使用 table 类型的构造函数 {} 替代。

在 Lua 5.1 版本中,module 函数的语法如下:

module (name [, ...])

其中,name 是一个字符串,表示要创建的模块的名称。... 中可以传递一些可选的参数,用于设置模块的属性。

module 函数会自动创建一个表格对象,并将该表格对象赋值给全局变量 name。如果 name 包含多个点号(.),则会自动创建相应数量的表格对象作为模块的子模块。例如,如果 name"a.b.c",则会自动创建 aa.ba.b.c 三个表格对象,分别对应 "a""a.b""a.b.c" 三个模块。

在使用 module 函数创建一个模块时,需要将该模块中的函数和变量定义在返回的表格对象中。以下示例演示了如何使用 module 创建一个名为 mylib 的模块,该模块包含了一个名为 add 的函数和一个名为 value 的变量:

module("mylib", package.seeall)

value = 42

function add(a, b)
    return a + b
end

在上面的示例中,module 函数用于创建一个名为 mylib 的模块,包含了一个变量 value 和一个函数 addpackage.seeall 参数用于设置在访问模块表格对象中不存在的元素时,自动在全局环境中查找相应的元素。

在其他 Lua 文件中,可以使用 require 函数加载该模块,并通过访问模块表格对象的元素来调用模块中的函数和变量。例如:

-- 加载 mylib 模块
local mylib = require("mylib")

-- 调用 mylib 中的函数和变量
local result = mylib.add(1, 2)
print(result) -- 输出 3

print(mylib.value) -- 输出 42

上述代码中,require 函数加载了名为 mylib 的模块,并将其赋值给变量 mylib。然后,使用 mylib 变量访问模块中的函数 add 和变量 value,并将其结果打印到控制台。

被废弃了

在 Lua 5.2 及以上版本中,module 函数被废弃了,主要原因是该函数不符合模块化编程的最佳实践。

module 函数会自动将模块表格对象赋值给全局变量,这样容易导致全局变量污染和命名冲突。此外,由于该函数还有一些其他问题,如无法兼容动态加载和重新加载等特性,因此在 Lua 社区中已经不再推荐使用该函数。

取而代之的是,在 Lua 5.2 及以上版本中,可以使用 table 类型的构造函数 {} 创建一个表格对象,并使用 return 语句返回该表格对象作为模块。以下示例演示了如何使用 {} 构造函数创建一个名为 mylib 的模块(与之前的示例相同),并将其结果返回:

local M = {}

M.value = 42

function M.add(a, b)
    return a + b
end

return M

在上面的示例中,使用 {} 构造函数创建了一个名为 M 的表格对象,并将 value 变量和 add 函数定义在该表格对象中。最后,使用 return 语句将该表格对象返回作为模块。

在其他 Lua 文件中,可以使用 require 函数加载该模块,并通过访问模块表格对象的元素来调用模块中的函数和变量。例如:

local mylib = require("mylib")

local result = mylib.add(1, 2)
print(result) -- 输出 3

print(mylib.value) -- 输出 42

上述代码中,require 函数加载了名为 mylib 的模块,并将其赋值给变量 mylib。然后,使用 mylib 变量访问模块中的函数 add 和变量 value,并将其结果打印到控制台。由于使用了表格对象而不是全局变量,因此可以有效避免全局变量污染和命名冲突的问题。

示例代码

--moduleTest1.lua
module("a.b.c", package.seeall)
print("in moduleTest1")
time = "10:15"
local weekday = "Monday"
 
--moduleTest2.lua
module("a.b.c", package.seeall)
print("in moduleTest2")
time = "20:15"
 
--moduleTest3.lua
module("module3")
print("in moduleTest3")
time = "10:15"
 
--main.lua
print("----------------------")
require("game.moduleTest1")     -- 输出:  in moduleTest1
print(a.b.c.time)               -- 输出:  10:15   成功访问module中全局变量
print(a.b.c.weekday)            -- 输出:  nil     无法访问module中local变量
print("----------------------")
require("game.moduleTest2")     -- 输出:  in moduleTest2
print(a.b.c.time)               -- 输出:  20:15   成功访问a.b.c被重新赋值的time
print("----------------------")
require("game.moduleTest3")     -- 输出:  attemp to call global print(a nil value)