关于lua的module函数 传参类型变成table

本文通过一个具体的Lua脚本示例,详细解释了Lua中模块(module)的使用方法及如何正确处理作用域问题,包括如何避免参数类型错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main.lua

require("Audio")
Audio:test1(3)
Audio:test2(3)
print(memberVar)
print(Audio.memberVar)

Audio.lua

module(..., package.seeall);

function test1(num)
  print(type(num))
end

function test2(self,num)
  print(type(num))
end

memberVar = 100

打印:

table
number
nil
100

可以看到test1传进去的参数类型变成了table类型。

原因在于module函数里的模块都是点号实现,需要传入self。

其中的module近乎等价于这段代码
local M = {};
local modelName = ...;
_G[modelName] = M;
setmetatable(M, {__index = _G});
setfenv(1, M);
Audio.lua这个模块里的全局环境设置为M,于是,我们直接定义函数的时候,不需要再带M前缀。

因为此时的全局环境就是M,不带前缀去定义变量,就是全局变量,这时的全局变量是保存在M里。

Audio.lua

等价于

local M = {};
local modelName = ...;
_G[modelName] = M;

function M.test1(num)
  print(type(num))
end

function M.test2(self,num)
  print(type(num))
end

M.memberVar = 100
return M;
其中“…”就是传递给模块的模块名,在这里其实就是“Audio”这个字符串。

至此豁然开朗。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值