使用luaL_ref键的元方法阴影问题

使用luaL_ref键的元方法阴影问题,lua,Lua,我有一个空表,它的_newindex和_index元方法是从C端实现的。该表将用作一个数组(t[1]=3,print(t[2])…),其中C捕获所有访问 现在,我想使用luaL_ref将另一个对象的引用添加到此表中,以防止第二个对象被gc丢弃。但我认为返回的引用可能会对我将用于此表的“虚拟”索引产生阴影: 例如,我希望t[1]=3调用uu newindex,但是如果lauL\u ref返回1,那么我的表将在“1”处有一个元素,那么u newindex将不再被调用 我知道luaL_ref保证返回表

我有一个空表,它的_newindex和_index元方法是从C端实现的。该表将用作一个数组(t[1]=3,print(t[2])…),其中C捕获所有访问

现在,我想使用luaL_ref将另一个对象的引用添加到此表中,以防止第二个对象被gc丢弃。但我认为返回的引用可能会对我将用于此表的“虚拟”索引产生阴影:

例如,我希望t[1]=3调用uu newindex,但是如果lauL\u ref返回1,那么我的表将在“1”处有一个元素,那么u newindex将不再被调用

我知道luaL_ref保证返回表中尚未使用的键,但由于表是空的(因此始终调用我的元方法),我认为它实际上可以返回低值,我可能会使用低值


这种推理有缺陷吗?如果没有,我如何解决这个问题?

我建议根本不要使用
luaL\u ref
。至少,不要放在你放元表的空表上。也许您应该在元表本身中引用它,或者在注册表中存储的其他内部表中引用它。

您没有解释为什么我不应该使用luaL_ref。无论如何,你和《卢亚》上的另一个家伙对元表也提出了同样的建议,所以我想这将是我最后的方法。@LorenzoPistone:你自己说过使用
luaL\u ref
的问题:它占用了表中的条目并破坏了元表的访问。表必须保持为空,元方法才能工作。因此,您必须使用不同的表将这些引用挂接到。这是Lua中的标准程序。