我已经在love2d引擎上做了一个luua控制台,这是无关紧要的。我试图升级metatables能够影响更多的东西(对功能,改变另一张桌子上的metatable而不是目标的等),我正在创建的其中一个插件是一个__changeindex
事件,当你修改现有指标。在lua中修改#操作符
为了做到这一点,我必须为用户提供一个不包含值的虚拟表,并且当他们尝试添加一些内容时,检查它是否已经在实际表中定义,如果是,则调用__changeindex
,如果它是不要致电__newindex
。这完美的工作,但这会导致许多其他的Lua表函数停止工作(for loops/getmetatable/setmetatable)。我做了变通方法对大多数的这些问题,他们的工作很好,但我不能让#T运营商的工作,我想能够说
t1={1,2,3}
t2=setmetatable({},{__getn=function(self) return #t1 end})
,然后#T2真的应该返回#T1。有什么办法可以做到这一点?
我现有的这个代码可以发现here
编辑:这是我的第一篇文章,所以我很抱歉,如果我没有跟着发帖规则完美,我试过:)也如果任何人有一个方法,使假和真正的表垃圾收集我真的很感激它
没有'__getn' metamethod。请改用'__len'。这只适用于Lua 5.2 – moteus
love2d不恰当地使用lua 5.1。我正在尝试创建__getn功能。如果你看看我发布的代码,我添加了__next,__ getn(只有table.getn版本),__ maxn,__ changeindex,__ setmetatable和将要添加更多功能 – KaoSDlanor
你不能在Lua中重载'#'运算符5.1。您可以使用userdata来创建代理对象。 't = newproxy(true) getmetatable(t).__ len = function()return 5 end print(#t)' – moteus