2012-11-09 14 views
1

我试图在一个函数中填充一个表,然后使用它在以后的调用中收到的值,在使用它之后删除每个值。由于某些原因,这些值在函数调用之间并不存在。当调用subscribeToService(),然后在unsubscribeToService()中减少时,应该填充容纳手柄的表格。在Lua函数中填充表不会反映到外部

local subscriptionSignals_AudioMixerManager = {"volumeLevel", "muteStatus", "fadeLevel", "balanceLevel", "bassLevel", "trebleLevel", "midLevel", "AVCLevel", "activeAudioSrc", "interruptSrc"} 
local signalHandlers_AudioMixerManager = {["volumeLevel"] = OnSignal, ["muteStatus"] = OnSignal, ["fadeLevel"] = onSignal, ["balanceLevel"] = OnSignal, ["bassLevel"] = OnSignal, ["trebleLevel"] = OnSignal, ["midLevel"] = OnSignal, ["AVCLevel"] = OnSignal, ["activeAudioSrc"] = OnSignal, ["interruptSrc"] = OnSignal} 
local subscriptionHandles_AudioMixerManager = {} 

local subscriptionSignals_AudioManager = {"targetSource"} 
local signalHandlers_AudioManager = {["targetSource"] = onAudioSourceChange} 
local subscriptionHandles_AudioManager = {} 

local function subscribeToService(objectPath, signalNames, signalHandlers, subscriptionHandles) 
    print("Subscribing...") 
    for i,v in ipairs(signalNames) do 
      subscriptionHandles[v] = service.subscribe(objectPath, v, signalHandlers[v]); 
      print(v .. " handle: ") 
      print(subscriptionHandles[v]) 
     end 
    print("Done subscribing") 
end 

local function unsubscribeFromService(subscriptionHandles) 
    print("Unsubscribing...") 
    for i,v in ipairs(subscriptionHandles) do 
      print("Entered for loop") 
      service.unsubscribe(v) 
      print(v) 
      subscriptionHandles[i] = nil 
     end 
    print("Done unsubscribing") 
end 

local function subscribe() 
    subscribeToService(AudioMixerManager, subscriptionSignals_AudioMixerManager, signalHandlers_AudioMixerManager, subscriptionHandles_AudioMixerManager) 
    subscribeToService(AudioManager, subscriptionSignals_AudioManager, signalHandlers_AudioManager, subscriptionHandles_AudioManager) 

    local result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-interrupt"}) 
    muteClientID = result.id 
    result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-modechange"}) 
    muteClientID2 = result.id 
end 

local function unsubscribe() 
    unsubscribeFromService(subscriptionHandles_AudioMixerManager); 
    unsubscribeFromService(subscriptionHandles_AudioManager); 
end 

我得到时subscribe()被称为以下的输出,再后来unsubscribe()

Subscribing... 
volumeLevel handle: 
userdata: 18f418 
muteStatus handle: 
userdata: 18f490 
fadeLevel handle: 
userdata: 18f508 
balanceLevel handle: 
userdata: 18f580 
bassLevel handle: 
userdata: 18f5f8 
trebleLevel handle: 
userdata: 18f670 
midLevel handle: 
userdata: 18f6e8 
AVCLevel handle: 
userdata: 18f760 
activeAudioSrc handle: 
userdata: 18f7d8 
interruptSrc handle: 
userdata: 18f850 
Done subscribing 
Subscribing... 
targetSource handle: 
userdata: 18f8c8 
Done subscribing 

Unsubscribing... 
Done unsubscribing 
Unsubscribing... 
Done unsubscribing 

它看起来像它甚至没有在unsubscribeFromService()我相信在进入for循环意味着表它被传递由于某种原因是空的。在Lua中是否曾经有过一个表不能通过引用传递的情况?它可以解释这种行为,因为我分解了较小的组件并单独测试它们,并且它们似乎正在工作。

回答

4

这是一个基本的错误,只是因为您在那里存在的代码量太多。考虑这个简化的例子:

local t = {} 
t["asdf"] = {} 

for i,v in ipairs(t) do 
    print(i, v) 
end 

这不打印任何东西!但是什么给了?肯定有东西在!

问题是ipairs()只遍历表中的数字索引,但是您使用字符串键插入值。要么你需要切换到使用pairs(),或者使用数字索引(可能不是你想要的)将值插入到subscriptionHandles表中。

+0

谢谢!我刚才在回来之前就明白了。 – user1510964

+2

@ user1510964:如果你真的想要感谢他,你可以点击旁边的绿色复选标记来接受他的答案。 –

2

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

  • subscriptionHandles_AudioMixerManagersubscriptionHandles_AudioManager被分配一个空表。
  • subscriptionHandles_AudioMixerManagersubscriptionHandles_AudioManager的所有元素都设置为零。