Луа, 2 дим. массив метатабельный получение значения, когда "ноль"
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
Мне нужно получить значение, даже если оно nil
из таблицы A
и поместите его в G
, Когда значение nil
в A
В таблице я получаю сообщение об ошибке "переполнение стека". Матрица симметричная, я перевернул значения с вертикали на горизонталь. Я не знаю, как это исправить.
1 ответ
Решение
Ваш __index
Функция просто собирается повторно вызвать тот же метаметод - следовательно, переполнение стека. вам нужно использовать rawget()
а ля rawget(rawget(A, j), i)
Я оставлю это в качестве упражнения для читателя, чтобы реализовать соответствующие проверки нуля.