Wie kann ich 2 Lua-Tabellen, die Tabellen als Schlüssel haben können oder nicht?
Also habe ich Deep-Copy-Algorithmen geschrieben, und ich möchte sie testen, um zu sehen, ob sie so funktionieren, wie ich es möchte. Während ich Zugriff auf die Original-> Kopie Karte habe, möchte ich einen Allzweck-Tiefvergleichsalgorithmus, der in der Lage sein muss, Tabellenschlüssel zu vergleichen (Tabellen als Schlüssel?).
Meine Deep-Copy-Algorithmus (en) sind hier verfügbar: https://gist.github.com/SoniEx2/fc5d3614614e4e3fe131 (es ist nicht sehr organisiert, aber es gibt 3 von ihnen, verwendet man rekursive Aufrufe, der andere verwendet eine Todo-Tabelle, und der andere simuliert einen Call-Stack (in einem sehr hässlich, aber 5.1-kompatible Art und Weise))
rekursive Version:
local function deep(inp,copies)
if type(inp) ~= "table" then
return inp
end
local out = {}
copies = (type(copies) == "table") and copies or {}
copies[inp] = out -- use normal assignment so we use copies' metatable (if any)
for key,value in next,inp do -- skip metatables by using next directly
-- we want a copy of the key and the value
-- if one is not available on the copies table, we have to make one
-- we can't do normal assignment here because metatabled copies tables might set metatables
-- out[copies[key] or deep(key,copies)]=copies[value] or deep(value,copies)
rawset(out,copies[key] or deep(key,copies),copies[value] or deep(value,copies))
end
return out
end
bearbeiten: ich fand Dinge wie diese, die wirklich keine Tabellen als Schlüssel handhaben: http://snippets.luacode.org/snippets/Deep_Comparison_of_Two_Values_3 (Kopie des snippet)
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
Serialisierung ist auch keine Option, da die Reihenfolge der Serialisierung "zufällig" ist.
Was ist die Frage hier genau? Arbeiten diese? Scheitern sie in bestimmten Fällen? Ich bin mir auch nicht sicher, ob ich genau verstehe, was du genau willst. Sie möchten zwei beliebige Tabellen miteinander vergleichen können? Die Schwierigkeit besteht darin zu versichern, dass du die Schlüssel in den Tischen auf beiden Seiten erschöpfen würdest, denke ich. –
@EtanReisner Ich habe keine einfache Möglichkeit zu testen, ob sie funktionieren, abgesehen davon, dass die Eingabe und Ausgabe hübsch gedruckt und dann manuell verglichen wird.Wenn ich einen automatisierten Weg hätte, es zu testen (auch, tief zu vergleichen), müsste ich meine Zeit nicht damit verbringen, manuell zu überprüfen, ob es richtig funktioniert ... Es wäre auch nützlich für eine Testsuite ... – SoniEx2
Sind Sie Versuche, Tabellen als Schlüssel nach Wert oder Inhalt zu vergleichen? Was ist mit Funktionen (entweder Schlüssel oder Werte)? Was ist mit C-Funktionen (gleich)? Was ist mit Userdata (gleich)? –