11

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

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

看看Lua 5.0 的实现中的第 4 节,表格。

Lua 5.1 源代码 - table.c

4

4 回答 4

10

这个想法是由 Roberto Ierusalimschy 和 Lua 团队的其他成员原创的。我听到 Roberto 在 2003 年的 MIT 轻量级语言研讨会上发表了关于它的演讲,在这次演讲中,他讨论了之前的工作,并令人信服地认为这个想法是新的。我不知道从那以后有没有其他语言复制它。

原始的 awk 的语言模型比 Lua 更受限制。数字或字符串都可以用作数组中的键,但数组本身不是一等值:数组必须有名称,并且数组不能用作数组中的键。

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

我没有费心去研究所有后来的 awk 实现,例如 Gnu Awk、mawk 等等。

于 2010-01-26T01:58:19.507 回答
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这也是语法糖(?)。

于 2010-01-24T08:46:11.723 回答
2

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

于 2010-01-24T02:33:38.070 回答
0

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

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

于 2016-07-27T04:11:31.680 回答