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)