我正在尝试制作动态多维数组,但在理解元表的工作方式时遇到了问题。这就像它有一个错误,它不知道如何获得和设置一个值。这里有一个例子:
function test(A)
local G = {}
local mt = {}
mt.__index = function(self, i)
self[i] = setmetatable({}, mt)
return self[i]
end
setmetatable(G, mt)
G[1] = 10 -- adds 10
G[1][2][3] = 10 -- error, why?breaks on G[1]
--but when i do it like this
G[1][2][3] = 10 -- adds 10
G[1] = 10 -- erases whole table and adds 10
print(G[1][2][3]) -- error
end
您将G[1]
设置为10
。10
不是一个表,所以G[1][2][3]
不可能工作。
仅供参考,只有当密钥指向nil
时才会调用__index
。如果G[1] == 10
,则G[1][2]
不能调用__index
。
我怀疑你认为G[1][2][3]
和G[1]
是两个完全独立的实体。事实并非如此。当你写:
G[1][2][3] = 42
它被解析为:
((G[1])[2])[3] = 42
换句话说,在表G
中,您访问索引1,然后在该表中,您访问索引2,然后在那个表中,分配给指数3。
这会让事情变得更清楚吗?
G[1][2][3]=10——错误,为什么?G[1]中断
它在G[1][2]
上中断,因为G[1]是数字,而不是表。尝试代理表:http://www.lua.org/pil/13.4.4.htmlCCD_ 14是回退。