2014-02-11 41 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