pairs игнорирует метаметод __index
Вот пример:
local t1 = {a = 1}
local t2 = {b = 2}
setmetatable(t1, {__index = t2})
assert(t1.a == 1) -- true
assert(t1.b == 2) -- true
for k, v in pairs(t1) do
print(k, v) -- печатает "a 1"
-- не хочет печатать "b 2"
end
Как же мне перебирать таблицу, не ингорируя __index?
Ответы (1 шт):
Автор решения: Beast Winterwolf
→ Ссылка
Придумал пока что такой костыль:
local t1 = {a = 1}
local t2 = {b = 2}
local t3 = {c = 3}
-- local t3 = function(t, k)
-- if k == "c" then return 3 end
-- end
setmetatable(t1, {__index = t2})
setmetatable(t2, {__index = t3})
assert(t1.a == 1)
assert(t1.b == 2)
assert(t1.c == 3)
local t = t1
while t do
for k, v in pairs(t) do print(k, v) end
t = getmetatable(t)
if t then t = t.__index end
end
К сожалению, он подводит, если __index - функция, а не таблица, но в остальном работает.