我在love2d引擎上制作了一个lua控制台,这是无关紧要的。我正在尝试升级metatables以便能够实现更多的事情(对函数,更改另一个表上的metatable而不是目标等),我正在制作的一个插件是一个__changeindex
事件修改现有索引时。
为了做到这一点,我必须给用户一个没有值的虚拟表,当他们尝试添加一些东西时检查是否已在真实表中定义,如果是,则调用__changeindex
,如果不是,则调用__newindex
。这很好用但是这导致许多其他Lua表函数停止工作(对于loops / getmetatable / setmetatable)。我为大多数问题制定了解决方法,它们工作正常,但我无法让#t运算符正常工作,我希望能够说出来
t1={1,2,3}
t2=setmetatable({},{__getn=function(self) return #t1 end})
然后#t2应该真正返回#t1。我有什么方法可以做到这一点吗?
我现有的代码可以找到here
编辑:这是我的第一篇文章,所以我道歉,如果我没有完全遵循发布规则,我试过:)如果有人有办法让假和真正的表垃圾收集我真的很感激答案 0 :(得分:2)
没有__getn
元方法。请尝试使用__len
。这仅适用于Lua 5.2
您无法为Lua 5.1
中的表重载#
运算符
您可以使用userdata创建代理对象:
t = newproxy(true)
getmetatable(t).__len = function()
return 5
end
print(#t) --> 5
但请注意,newproxy
函数为undocumented。