Lua的混合数组和哈希表;它存在于其他地方吗?

时间:2010-01-24 02:21:38

标签: arrays data-structures hash lua lua-table

Lua的表实现将其元素分为两部分:数组部分和散列部分。

这种事情是否存在于任何其他语言中?

The Implementation of Lua 5.0中查看第4节“表格”。

Lua 5.1 Source Code - table.c

4 个答案:

答案 0 :(得分:9)

这个想法与Roberto Ierusalimschy以及Lua团队的其他成员原创。我听说罗伯托在2003年麻省理工学院轻量级语言研讨会上就此进行了讨论,在这次演讲中,他讨论了以前的工作并且令人信服地认为这个想法是新的。我不知道其他语言是否已经复制过它。

最初的Awk语言模型比Lua更受限制;数字或字符串可以用作数组中的键,但数组本身不是第一类值:数组必须具有名称,并且数组不能用作数组中的键。

关于实现,我检查了由Brian Kernighan维护的原始Awk的源代码,并且Awk的实现使用哈希表,而不是Lua的混合数组/表结构。区别很重要,因为在Lua中,当表与连续的整数键一起使用时,空间开销与C数组相同。对于原始的Awk,为真。

我没有费心去调查awk的所有后续实现,例如Gnu Awk,mawk等。

答案 1 :(得分:4)

编辑:这不回答有关实施的问题。

AWK也做到了。

它正在考虑一些语言如何混淆其他语言不同的操作:

  • 列出索引 - a[10]
  • 关联索引 - a['foo']
  • 对象字段访问权限 - a.foo
  • 功能/方法调用 - a('foo') / a.foo()

非常不完整的例子:

  • Perl是一种罕见的语言,其中顺序/关联索引具有单独的语法 - a[10] / a{'foo'}。 AFAIK,对象字段映射到其他操作之一,具体取决于该类的实现者使用它。

  • 在Python中,所有4个都是截然不同的;顺序/关联索引使用相同的语法,但为它们优化了单独的数据类型。

  • 在Ruby中,对象字段是没有参数的方法 - a.foo

  • 在JavaScript中,对象字段a.foo是关联索引a['foo']的语法糖。

  • 在Lua和AWK中,关联数组也用于顺序索引 - a[10]

  • Arc中,顺序和关联索引看起来像函数调用 - (a 10) / (a "foo"),我认为a.foo也是语法糖(?{ )。

答案 2 :(得分:2)

我能想到的最接近的事情是Javascript - 您使用new Array()创建一个数组,然后按数字或字符串值继续索引。出于性能原因,一些Javascript实现可能会选择使用两个数组,原因是您链接到的Lua文档中提到的原因。

答案 3 :(得分:0)

ArrayWithHash是C ++中数组哈希表混合的快速实现。

由于C ++是静态类型语言,因此ArrayWithHash中只允许使用整数键(无法插入字符串或指针键)。换句话说,它类似于具有大型索引的哈希表备份的数组。它还使用不同的哈希表实现,这比Lua表实现的内存效率低。