Lua では、別々に作成された 2 つのテーブルは「異なる」と見なされます。しかし、一度テーブルを作成すると、それを任意の変数に割り当てることができ、それらを比較すると、Lua はそれらが等しいことを教えてくれます。言い換えると:
t = {}
key = { a = "a" }
t[key] = 4
key2 = key
...
t[key2] -- returns 4
だから、それはあなたが望むことをするためのシンプルでクリーンな方法です. どこかに保管して、それを使用してバックをkey
取り出すことができます. 4
これも非常に高速です。
どうしてもやりたくない場合は、方法があります。しかし、それは一種の非効率的で醜いです。
最初の部分は、2 つの別々のテーブルを比較する関数を作成することです。2 つのテーブルが「同等」である場合は true を返し、そうでない場合は false を返します。それを同等と呼びましょう。次のように動作するはずです。
equivalent({a=1},{a=1}) -- true
equivalent({a=1,b=2}, {a=1}) -- false
equivalent({a={b=1}}, {a={b=2}}) -- false
テーブル自体を含むテーブルを処理するために、関数は再帰的でなければなりません。テーブルの 1 つが他のテーブルを「含んでいる」が、より多くの要素を持っている場合にもだまされてはなりません。私はこの実装を思いつきました。おそらくもっと良いものがあります。
local function equivalent(a,b)
if type(a) ~= 'table' then return a == b end
local counta, countb = 0, 0
for k,va in pairs(a) do
if not equivalent(va, b[k]) then return false end
counta = counta + 1
end
for _,_ in pairs(b) do countb = countb + 1 end
return counta == countb
end
ここではその機能について説明しません。それが何をするのかが十分に明確であることを願っています。
パズルの他の部分は、キーを比較するときに関数をt
使用することです。equivalent
これは、メタテーブルを慎重に操作し、追加の「ストレージ」テーブルを使用して行うことができます。
私たちは基本的t
に偽者に変身します。コードがキーの下に値を保存するように指示した場合、それ自体は保存されません。代わりに、それを追加のテーブルに渡します (これを と呼びますstore
)。コードが値を要求t
すると、 で値を検索しますstore
が、関数を使用してequivalent
値を取得します。
これはコードです:
local function equivalent(a,b)
... -- same code as before
end
local store = {} -- this is the table that stores the values
t = setmetatable({}, {
__newindex = store,
__index = function(tbl, key)
for k,v in pairs(store) do
if equivalent(k,key) then return v end
end
end
})
使用例:
t[{a = 1}] = 4
print(t[{a = 1}]) -- 4
print(t[{a = 1, b = 2}]) -- nil