我正在尝试制作动态多维数组,但我在理解metatables的工作方式时遇到了问题。它有像bug一样,并且不了解如何获得和设置一个值。这是一个例子:
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
答案 0 :(得分:2)
您将G[1]
设置为10
。 10
不是表,因此G[1][2][3]
无法正常工作。
仅供参考,__index
仅在密钥指向nil
时调用。如果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。
这会让它更清楚吗?
答案 1 :(得分:0)
G [1] [2] [3] = 10 - 错误,为什么?打破G [1]
它在G[1][2]
上休息,因为G [1]是数字,而不是表格。
尝试代理表:http://www.lua.org/pil/13.4.4.html
__index
是后备。