Lua, 2-暗淡。数组元表在 "nil" 时获取值
Lua, 2-dim. array metatable getting value when "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)
-- 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
我正在尝试使用 __index
将新的 table 添加到 "G",我需要 获取 值,即使它是 nil
, 来自 table A
并放在 G
中。当 A
table 中的值为 nil
时,我收到错误 "stack overflow"。矩阵是对称的,我将值从垂直翻转为水平。我不知道如何解决这个问题。
您的 __index
函数将重新调用相同的元方法 - 因此堆栈溢出。你需要使用 rawget()
a la rawget(rawget(A, j), i)
我将把它留作 reader 的练习以实施适当的空值检查。
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
我正在尝试使用 __index
将新的 table 添加到 "G",我需要 获取 值,即使它是 nil
, 来自 table A
并放在 G
中。当 A
table 中的值为 nil
时,我收到错误 "stack overflow"。矩阵是对称的,我将值从垂直翻转为水平。我不知道如何解决这个问题。
您的 __index
函数将重新调用相同的元方法 - 因此堆栈溢出。你需要使用 rawget()
a la rawget(rawget(A, j), i)
我将把它留作 reader 的练习以实施适当的空值检查。