2013-08-22 44 views
3

大多數語言都提供了一些方法,可以使用等價關係和散列函數(使用散列表)或使用順序關係(使用樹)來有效地爲任何類型的鍵實現映射。如何使用Lua中自己的唯一鍵實現映射?

但是,似乎Lua表只提供這個字符串。具體而言,如果使用Lua表(概念上實現「對象」)作爲關鍵字,則只能通過引用同一個對象再次查找,而不是具有相同「內容」的新對象。

這是需要實現類似於數據庫索引或基於「唯一」鍵的某個值的緩存的行爲,至少不採用線性時間查找。

我唯一能想到的是,如果關鍵對象是由字段f1,...,fn組成的,我們可以製作一堆嵌套地圖並像這樣查找T[f1][f2]...[fn](至少如果字段本身是整數或字符串) 。這有點可怕,打破了將「f1,...,fn」封裝成「對象」的意圖。

還有其他想法嗎?

+2

您是否嘗試過重寫表上的__index'元方法?它允許你處理索引自己的使用方式。然後,您可以檢查關鍵表格的內容而不是其參考。請參閱http://www.lua.org/pil/13.4.1.html – SolarBear

回答

3

它看起來像你想要的可能是像this

否則一個有效的方法是以確定的方式將您的密鑰序列化到字符串,並使用結果(或它的散列)作爲密鑰。

就像SolarBear在評論中告訴你的,然後你可以使用methamethods使其具有與常規表相同的界面。

+0

不會使用密鑰的散列依賴於根本沒有散列衝突?即使覆蓋__index也不會阻止它覆蓋具有相同散列值的早期條目[如果我理解正確的話] – yonil

+0

@catwell澄清 - 我認爲,當你以確定性的方式說*序列化時,實際密鑰與其內部字符串表示之間的一對一映射。 –

+1

@yonil如果你使用散列,你必須在__index和__newindex中自己處理衝突。我猜想,只有當內部字符串表示變得太大並且浪費大量內存時,散列纔是有益的。一個合適的散列函數可能是一種「壓縮」它的方法。我認爲這是一個權衡內存與實現的複雜性(如果我正確地猜測了你的想法,則爲@catwell)。 –

0

您可以使用表格索引表格,從而可以將它們用作參考。

local cache = {} 
local t = {} 
cache[t] = 345 -- key is not important, but must not equal nil 
local other = { 
    ref = t 
} 

... 
print(cache[other.ref]