2016-07-20 9 views
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 

Ich versuche, neue Tabelle „G“ hinzufügen __index verwenden, muss ich Wert bekommen, auch wenn es nil, aus der Tabelle A und legen Sie sie in G. Wenn der Wert nil in A Tabelle ist, bekomme ich einen Fehler "Stack Overflow". Matrix ist symmetrisch, ich habe die Werte von vertikal nach horizontal umgedreht. Ich weiß nicht, wie ich das beheben soll.Lua, 2-dim. Array Metatabelle immer Wert, wenn „Null“

Antwort

1

Ihre __index Funktion wird nur die gleiche Metamethode wieder aufrufen - daher der Stapelüberlauf. Sie müssen verwenden rawget() a la rawget(rawget(A, j), i)

Ich werde es als Übung für den Leser, um entsprechende Null-Prüfungen zu implementieren.

+0

Hinzugefügt "Rawget (Rawget (A, J), ich)" und arbeitete wie ein Charme. Danke! –