2014-02-11 43 views
4

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

编辑:这是我的第一篇文章,所以我很抱歉,如果我没有跟着发帖规则完美,我试过:)也如果任何人有一个方法,使假和真正的表垃圾收集我真的很感激它

+6

没有'__getn' metamethod。请改用'__len'。这只适用于Lua 5.2 – moteus

+0

love2d不恰当地使用lua 5.1。我正在尝试创建__getn功能。如果你看看我发布的代码,我添加了__next,__ getn(只有table.getn版本),__ maxn,__ changeindex,__ setmetatable和将要添加更多功能 – KaoSDlanor

+4

你不能在Lua中重载'#'运算符5.1。您可以使用userdata来创建代理对象。 't = newproxy(true) getmetatable(t).__ len = function()return 5 end print(#t)' – moteus

回答

2

有没有__getn metamethod。改为尝试__len。这仅适用于Lua 5.2

你不能重载#运营商表中Lua 5.1

你可以使用用户数据来创建一个代理对象:

t = newproxy(true) 
getmetatable(t).__len = function() 
    return 5 
end 

print(#t) --> 5 

不过请注意,该newproxy功能undocumented