2013-06-28 47 views
3

據我所知,lua不要叫__index,除非在表中找不到密鑰,所以我有那個代碼,它在__index部分遭受無限遞歸,我沒有得到因爲在__index函數中使用的兩個值已經存在於表中!__index metamethod中的無限遞歸

這基本上是試圖挽救該表的大小在內存中檢索時#被稱爲

do 
local lenKey,originalKey = {},{} 
fastKey = {} 
fastKey.__len = function(t) return t[lenKey] end 
fastKey.__index = function (t,k) 
         t[lenKey] = t[lenKey] +1 
         return t[oroginalKey][k] 
       end 
fastKey.__newindex = function(t,k,v) t[originalKey][k] = v end 
fastKey.__pairs = function() 
        return function (t, k) 
           return next(t[oroginalKey], k) 
          end 
       end 

function fastLen(t) 
    local proxy = {} 
    local c = 0 
    for _ in pairs(t) do 
     c=c+1 
    end 
    proxy[lenKey] = c        
    proxy[originalKey] = t           
    setmetatable(proxy,fastKey) 
    return proxy 
end 
end 

n = fastLen{1,2,3,x=5} 
--n:insert(1) -- here the __index is called and gets stackoverflow 
print(#n) 
+1

嘗試'originalKey'而不是'oroginalKey'。 –

+0

嗯,這是跛腳。我修改了腳本很多次,從來沒有看到它,謝謝你的幫助,似乎還有其他的邏輯錯誤,我必須解決。 –

+0

別擔心。發生到最好;)。 –

回答

4

你在那裏有兩個錯別字測試腳本:無論是__index__pairs功能包含oroginalKey而不是originalKey

+2

這個答案是正確的,但爲了避免無限的外觀,你還應該考慮在metamethods的定義中訪問表時使用'rawget'。 – catwell