在Lua函数中填充表格不会在外部反映出来。

我正试图在一个函数内填充一个表格,然后在稍后的调用中使用它接收到的值,在使用每个值后删除它。由于某种原因,在函数调用之间,这些值不会保留。当调用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中,是否有可能出现表未被引用的情况?这可能解释了这种行为,因为我已经将其拆分为较小的组件并单独测试它们,它们看起来是正常工作的。

点赞
用户1183484
用户1183484

在Lua中,表总是通过引用传递。这意味着在subscribe()unsubscribe()调用之间发生的是:

  • subscriptionHandles_AudioMixerManagersubscriptionHandles_AudioManager被分配一个空表。
  • subscriptionHandles_AudioMixerManagersubscriptionHandles_AudioManager的所有元素都被设置为nil。
2012-11-09 16:24:21
用户1208078
用户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