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 - функция, а не таблица, но в остальном работает.

→ Ссылка