2013-08-19 30 views
0

我分配值的鍵在返回後仍然爲零!Lua:表格元素不希望在值存在時被複制

p = {}; 
for i = 0, 1000 do 
    p[ i ] = {}; 
end 

t = {} 
t.__index = t 

function new() 
    local o = setmetatable({}, t) 


    for key, value in pairs(p[1]) do 
     print(key .. " : " .. value) 
     o[ key ] = value 
    end 

    t.__newindex = function(t, key, value) 
     if type(value) ~= "function" then 
      p[1][key] = value 
     end 
    end 


    return o 
end 

local something = new() 

something.xxx = 666 
print(p[1].xxx) 

local something = new() 
print(something.xxx) 
print(p[1].xxx) 

的問題是它:

for key, value in pairs(p[1]) do 
    print(key .. " : " .. value) 
    o[ key ] = value 
end 

這說明XXX:666,但問題o [關鍵]仍爲零,當我返回。輸出是

666 
xxx : 666 
nil 
666 

編輯:是的,我剛纔意識到。由於淨帶寬,我會給你upvotes(不能運行與JavaScript的stac)謝謝,現在它的作品。基於前一個創建新的對象。

+0

爲什麼在每次調用new時都設置't .__ newindex'? – idoby

回答

0

o[ key ] = value將調用newindex metamethod。但是由於您尚未將其設置爲,它會執行默認操作。這就是將value設置爲o的表格,索引號爲key

當然,index metamethod不會在乎o的表格是什麼;它看着自己。因此,您以後的o[key]將在key的metatable中查找,它不會找到它。

目前還不清楚這段代碼試圖完成什麼。

0

您設置__index元方法爲新表o到T,其中只包含__index__newindex,其中沒有一個等於xxx,所以查找失敗並返回nil。您可能想改爲說t.__index = p