Сравнение двух таблиц

Опубликовано в QLua

Как сравнить 2 таблицы (да и просто 2 любых объекта) на идентичность с учетом возможного наличия метаметода __eq?

Функция сравнения любых двух значений, включая таблицы, включая вложенные. Если ignore_mt == true, метаметоды не используются. Найдена в сети.

function deepcompare(t1,t2,ignore_mt)
local ty1 = type(t1)
local ty2 = type(t2)
if ty1 ~= ty2 then return false end
-- non-table types can be directly compared
if ty1 ~= 'table' and ty2 ~= 'table' then return t1 == t2 end
-- as well as tables which have the metamethod __eq
local mt = getmetatable(t1)
if not ignore_mt and mt and mt.__eq then return t1 == t2 end
for k1,v1 in pairs(t1) do
local v2 = t2[k1]
if v2 == nil or not deepcompare(v1,v2) then return false end
end
for k2,v2 in pairs(t2) do
local v1 = t1[k2]
if v1 == nil or not deepcompare(v1,v2) then return false end
end
return true
end

Недостаточно прав для комментирования

Архив QLua