Lua, 2维数组元表在"nil"时获取值

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)
    -- 当在 "A" 中的值为 **nil** 时,循环时就会中断
    -- 当我执行 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]) -- 返回 4
print(G[1][4]) -- 返回 0

for j=1, n do
    for i=j, n do
       -- G[i][j] = G[i][j]
       io.write(G[i][j], "; ") -- 当 i=4 时 出现错误,循环在 __index 中...
    end
end

我正试图使用 __index 将新的表添加到 "G" 中,我需要获取值,即使它是 nil,并将其放入 G 中。当 A 表中的值为 nil 时,我会收到一个 "stack overflow" 错误。这个矩阵是对称的,我将值从垂直翻转到水平。我不知道如何解决这个问题。

点赞
用户234946
用户234946

你的 __index 函数只是重新调用了同一个元方法,因此出现了堆栈溢出。你需要使用 rawget(),比如 rawget(rawget(A, j), i)

我会让读者自己实现适当的空值检查。

2016-07-20 01:17:08