[✔️]lua中的module函数

简介: [✔️]lua中的module函数

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)


目录
相关文章
|
7月前
|
存储 C语言 图形学
C 函数中如何保存 Lua 的数据(1)
C 函数中如何保存 Lua 的数据(1)
95 0
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
106 0
|
2月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
32 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
2月前
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
84 1
|
7月前
|
C语言 C++ 索引
C 函数中如何保存 Lua 的数据(2)
C 函数中如何保存 Lua 的数据(2)
83 1
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
151 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
|
数据采集 大数据 开发者
Lua 语法函数|学习笔记
快速学习 Lua 语法函数
Lua 语法函数|学习笔记
|
C语言 索引
lua语言——函数
lua语言——函数
160 0
06 Lua 库函数
Lua 体积小、启动速度快,一个完整的 Lua 解释器不过200k,在所有脚本引擎中,Lua 的速度可以说是最快的。所以 Lua 是作为嵌入式脚本的最佳选择。
06 Lua 库函数