Lua,2-dim。当“nil”时,数组metatable获取值

时间:2016-07-20 00:06:31

标签: indexing lua metatable

local A = {{16},
            {4,10},
            {4,4,6},
            {nil,2,-2,4}} -- nil

local n = #A
local G = {}
local mt = {}
mt.__index = function(self, i)
    -- when it goes throw for-loop it brakes when value in "A" is **nil**
    -- also brakes when i do print(G[4][1])
    self[i] = setmetatable({}, {__index = setmetatable(A[i], {__index = function(s, j) return A[j][i] or 0 end})}) 
    return self[i]
end

setmetatable(G, mt)

print(G[1][3]) -- returns 4
print(G[1][4]) -- returns 0

for j=1, n do
    for i=j, n do
       -- G[i][j] = G[i][j]
       io.write(G[i][j], "; ") -- on i=4 i get error, loops in __index...
    end
end

我正在尝试使用__index将新表添加到“G”,我需要获取值,即使它是nil,也可以从表A开始并将其放在G中。当nil表中的值为A时,我收到错误“堆栈溢出”。矩阵是对称的,我将值从垂直翻转到水平。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

你的__index函数只是重新调用相同的元方法 - 因此堆栈溢出。您需要使用rawget() la rawget(rawget(A, j), i)

我将其作为练习让读者实施适当的空检查。