Lua:当值存在时,表元素不希望被复制

在返回后,我给定值的键仍然是nil!

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[ key ]仍然是nil。输出如下:

666
xxx : 666
nil
666

编辑:是的,我刚刚意识到了。由于网络带宽原因(无法用JavaScript运行stac),稍后我会给你点赞。谢谢,现在它可以工作了。基于先前的对象创建了一个新对象。

点赞
用户734069
用户734069

o[ key ] = value 会调用 newindex 元方法。但由于你尚未设置它,它将执行默认操作,也就是将 value 设置到 o 的表中的索引 key 上。

当然,index 元方法不在乎 o 的表中有什么; 它正在看它自己。因此,稍后的 o [key] 将在元表中查找 key,但它却找不到。

不清楚这段代码想要实现什么。

2013-08-19 12:33:35
用户1997006
用户1997006

你将新表 o__index 元方法设置为包含 __index__newindex 的 t,但是它们都不等于 xxx,因此查询失败并返回 nil。你可能想要使用 t.__index = p

2013-08-19 12:35:43