在lua中修改#manrator

时间:2014-02-11 10:04:16

标签: lua operator-overloading lua-table metatable meta-method

我在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

编辑:这是我的第一篇文章,所以我道歉,如果我没有完全遵循发布规则,我试过:)如果有人有办法让假和真正的表垃圾收集我真的很感激

1 个答案:

答案 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