module函数
在 Lua 5.1 版本中,module 函数用于创建一个模块。在 Lua 5.2 及以上版本中,这个函数已经被废弃了,可以使用 table 类型的构造函数 {} 替代。
在 Lua 5.1 版本中,module 函数的语法如下:
module (name [, ...])
其中,name 是一个字符串,表示要创建的模块的名称。... 中可以传递一些可选的参数,用于设置模块的属性。
module 函数会自动创建一个表格对象,并将该表格对象赋值给全局变量 name。如果 name 包含多个点号(.),则会自动创建相应数量的表格对象作为模块的子模块。例如,如果 name 为 "a.b.c",则会自动创建 a、a.b 和 a.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 和一个函数 add。package.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)