2013-08-19 77 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