如何使用Lua中自己的表的唯一键来实现映射?

时间:2013-08-22 12:01:00

标签: lua lua-table

大多数语言提供了一些方法,可以使用等价关系和散列函数(使用哈希表)或使用顺序关系(使用树)有效地为任何类型的键实现映射。

然而,似乎Lua表仅为字符串提供此功能。具体来说,如果使用Lua表(在概念上实现“对象”)作为键,则只能通过引用同一对象再次查找,而不能使用相同“内容”的新对象查找。

这需要实现类似于数据库索引的行为或基于“唯一”键的某个值的缓存,至少不需要求助于线性时间查找。

我唯一能想到的是,如果关键对象是由字段f1,...,fn构成的,我们可以制作一堆嵌套的地图并查找它T[f1][f2]...[fn](至少如果字段本身是整数或字符串)。这有点糟糕,打破了将f1,...,fn封装到“对象”中的意图。

还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

看起来你想要的可能是this

否则,有效的方法是以确定的方式将密钥序列化为字符串,并使用结果(或其散列)作为密钥。

就像SolarBear在评论中告诉你的那样,你可以使用methamethods使它具有与普通表相同的界面。

答案 1 :(得分: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]