在Lua函数中填充表格不会在外部反映出来。
2013-3-22 1:37:44
收藏:0
阅读:121
评论:2
我正试图在一个函数内填充一个表格,然后在稍后的调用中使用它接收到的值,在使用每个值后删除它。由于某种原因,在函数调用之间,这些值不会保留。当调用subscribeToService()时,保存句柄的表应该被填充,然后在unsubscribeToService()中被清空。
本地变量 subscriptionSignals_AudioMixerManager = {"volumeLevel", "muteStatus", "fadeLevel", "balanceLevel", "bassLevel", "trebleLevel", "midLevel", "AVCLevel", "activeAudioSrc", "interruptSrc"}
本地变量 signalHandlers_AudioMixerManager = {["volumeLevel"] = OnSignal, ["muteStatus"] = OnSignal, ["fadeLevel"] = onSignal, ["balanceLevel"] = OnSignal, ["bassLevel"] = OnSignal, ["trebleLevel"] = OnSignal, ["midLevel"] = OnSignal, ["AVCLevel"] = OnSignal, ["activeAudioSrc"] = OnSignal, ["interruptSrc"] = OnSignal}
本地变量 subscriptionHandles_AudioMixerManager = {}
本地变量 subscriptionSignals_AudioManager = {"targetSource"}
本地变量 signalHandlers_AudioManager = {["targetSource"] = onAudioSourceChange}
本地变量 subscriptionHandles_AudioManager = {}
本地函数 subscribeToService(objectPath, signalNames, signalHandlers, subscriptionHandles)
print("Subscribing...")
对于 i,v 在信号名称中做迭代,因为
subscriptionHandles[v] = service.subscribe(objectPath, v, signalHandlers[v]);
print(v .. " 句柄: ")
print(subscriptionHandles[v])
结束
print("完成订阅")
结束
本地函数 unsubscribeFromService(subscriptionHandles)
print("取消订阅...")
对于 i,v 在 subscriptionHandles 中做迭代,因为
print("输入循环")
service.unsubscribe(v)
print(v)
subscriptionHandles[i] = nil
结束
print("完成取消订阅")
结束
本地函数 subscribe()
subscribeToService(AudioMixerManager, subscriptionSignals_AudioMixerManager, signalHandlers_AudioMixerManager, subscriptionHandles_AudioMixerManager)
subscribeToService(AudioManager, subscriptionSignals_AudioManager, signalHandlers_AudioManager, subscriptionHandles_AudioManager)
本地变量 result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-interrupt"})
muteClientID = result.id
result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-modechange"})
muteClientID2 = result.id
结束
本地函数 unsubscribe()
unsubscribeFromService(subscriptionHandles_AudioMixerManager);
unsubscribeFromService(subscriptionHandles_AudioManager);
结束
当调用subscribe(),然后稍后调用unsubscribe()时,我得到以下输出:
订阅中...
volumeLevel 句柄:
userdata: 18f418
muteStatus 句柄:
userdata: 18f490
fadeLevel 句柄:
userdata: 18f508
balanceLevel 句柄:
userdata: 18f580
bassLevel 句柄:
userdata: 18f5f8
trebleLevel 句柄:
userdata: 18f670
midLevel 句柄:
userdata: 18f6e8
AVCLevel 句柄:
userdata: 18f760
activeAudioSrc 句柄:
userdata: 18f7d8
interruptSrc 句柄:
userdata: 18f850
完成订阅
订阅中...
targetSource 句柄:
userdata: 18f8c8
完成订阅
取消订阅...
完成取消订阅
取消订阅...
完成取消订阅
看起来它甚至没有进入unsubscribeFromService()中的for循环,我相信这意味着原本被传递的表因某种原因为空。在Lua中,是否有可能出现表未被引用的情况?这可能解释了这种行为,因为我已经将其拆分为较小的组件并单独测试它们,它们看起来是正常工作的。
点赞
用户1208078
这只是一个基础错误,但由于你的代码过多,因此变得复杂。考虑下面这个简化的示例:
local t = {}
t["asdf"] = {}
for i,v in ipairs(t) do
print(i, v)
end
这并不会打印任何东西!但问题在哪里呢?t中肯定有什么!
问题在于ipairs()只会迭代表中的 数字 索引,而你正在使用字符串键插入值。你要么需要改用pairs(),要么使用数字索引将值插入subscriptionHandles表(可能不是你想要的)。
2012-11-09 16:29:02
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
在Lua中,表总是通过引用传递。这意味着在
subscribe()和unsubscribe()调用之间发生的是:subscriptionHandles_AudioMixerManager和subscriptionHandles_AudioManager被分配一个空表。subscriptionHandles_AudioMixerManager和subscriptionHandles_AudioManager的所有元素都被设置为nil。