Function 在Lua函数中填充表不是';外面没有反射

Function 在Lua函数中填充表不是';外面没有反射,function,reference,lua,lua-table,Function,Reference,Lua,Lua Table,我试图在一个函数中填充一个表,然后使用它在以后的调用中接收到的值,在使用每个值之后删除它。由于某些原因,这些值在函数调用之间不会持久化。在调用subscribeToService()时,应填充包含句柄的表,然后在unsubscribeToService()中取消填充 当调用subscribe()时,然后调用unsubscribe() 订阅。。。 卷级手柄: 用户数据:18f418 互斥状态句柄: 用户数据:18f490 fadeLevel手柄: 用户数据:18f508 平衡水平手柄: 用户数据:

我试图在一个函数中填充一个表,然后使用它在以后的调用中接收到的值,在使用每个值之后删除它。由于某些原因,这些值在函数调用之间不会持久化。在调用
subscribeToService()
时,应填充包含句柄的表,然后在
unsubscribeToService()
中取消填充

当调用
subscribe()
时,然后调用
unsubscribe()

订阅。。。
卷级手柄:
用户数据:18f418
互斥状态句柄:
用户数据:18f490
fadeLevel手柄:
用户数据:18f508
平衡水平手柄:
用户数据:18f580
水平手柄:
用户数据:18f5f8
三级手柄:
用户数据:18f670
中级手柄:
用户数据:18f6e8
AVL手柄:
用户数据:18f760
activeAudioSrc句柄:
用户数据:18f7d8
中断SRC句柄:
用户数据:18f850
订阅完毕
订阅。。。
targetSource句柄:
用户数据:18f8c8
订阅完毕
取消订阅。。。
取消订阅完成
取消订阅。。。
取消订阅完成

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

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

  • subscriptionHandles\u AudioMixerManager
    subscriptionHandles\u AudioManager
    分配了一个空表
  • subscriptionHandles\u audiomixermanger
    subscriptionHandles\u AudioManager
    的所有元素都设置为零

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

  • subscriptionHandles\u AudioMixerManager
    subscriptionHandles\u AudioManager
    分配了一个空表
  • subscriptionHandles\u audiomixermanger
    subscriptionHandles\u AudioManager
    的所有元素都设置为零

这是一个基本错误,由于代码量过大而变得复杂。考虑这个简化的例子:

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

for i,v in ipairs(t) do
    print(i, v)
end
这没有打印任何东西!但有什么好处呢?t中肯定有东西


问题是ipairs()只在表中的数字索引上迭代,而您是在使用字符串键插入值。您可能需要切换到使用pairs(),或者通过使用数字索引(可能不是您想要的)将值插入subscriptionHandles表。

这是一个基本错误,只是由于代码量过多而变得过于复杂。考虑这个简化的例子:

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

for i,v in ipairs(t) do
    print(i, v)
end
这没有打印任何东西!但有什么好处呢?t中肯定有东西


问题是ipairs()只在表中的数字索引上迭代,而您是在使用字符串键插入值。您需要切换到使用pairs(),或者使用数字索引(可能不是您想要的)将值插入subscriptionHandles表。

谢谢!我在回来之前就想好了。@user1510964:如果你真的想感谢他,你可以点击旁边的绿色复选标记来接受他的回答。谢谢!在我回来之前,我就知道了。@user1510964:如果你真的想感谢他,你可以点击旁边的绿色复选标记来接受他的回答。