1
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

を使用して「G」に新しいテーブルを追加しようとしています。値が であっても、テーブルから値を取得して に配置__indexする必要があります。値がテーブルにある場合、「スタック オーバーフロー」というエラーが発生します。マトリックスは対称です。値を垂直から水平に反転させました。これを修正する方法がわかりません。nilAGnilA

4

1 に答える 1

1

あなたの__index関数は同じメタメソッドを再度呼び出すだけなので、スタックオーバーフローが発生します。rawget()あなたはラを使用する必要がありますrawget(rawget(A, j), i)

読者が適切な null チェックを実装するための演習として残しておきます。

于 2016-07-20T01:17:08.587 に答える