2016-07-20 1 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 

"전무"배열 메타 테이블 점점 값이 때, 나는 테이블 A에서, nil 경우에도, 값을 얻을 G에 배치 해야합니다. 값이 nil이면 A 테이블에 "스택 오버플로"오류가 발생합니다. 행렬은 대칭입니다. 값을 수직에서 수평으로 바꿨습니다. 이 문제를 해결하는 방법을 모르겠습니다.루아, 2 - dim. 내가 <code>__index</code>을 사용하여 새 테이블에 "G"를 추가하려고

답변

1

__index 함수는 동일한 메타 메서드를 다시 호출하기 때문에 스택 오버플로가 발생합니다. 당신은 rawget() 라를 사용해야합니다 rawget(rawget(A, j), i)

적절한 null 확인을 구현하는 독자를위한 연습으로 남겨 두겠습니다.

+0

"rawget (rawget (A, j), i)"를 추가하고 매력처럼 작동했습니다. 감사합니다! –

관련 문제