Lua 的表实现将其元素分为两部分:数组部分和散列部分。
这样的事情是否存在于任何其他语言中?
看看Lua 5.0 的实现中的第 4 节,表格。
这个想法是由 Roberto Ierusalimschy 和 Lua 团队的其他成员原创的。我听到 Roberto 在 2003 年的 MIT 轻量级语言研讨会上发表了关于它的演讲,在这次演讲中,他讨论了之前的工作,并令人信服地认为这个想法是新的。我不知道从那以后有没有其他语言复制它。
原始的 awk 的语言模型比 Lua 更受限制。数字或字符串都可以用作数组中的键,但数组本身不是一等值:数组必须有名称,并且数组不能用作数组中的键。
关于实现,我检查了由 Brian Kernighan 维护的原始 Awk 的来源,并且 Awk 的实现使用哈希表,而不是 Lua 的混合数组/表结构。区别很重要,因为在 Lua 中,当表与连续整数键一起使用时,空间开销与 C 数组相同。这不适用于原始 awk。
我没有费心去研究所有后来的 awk 实现,例如 Gnu Awk、mawk 等等。
编辑:这没有回答关于实施的问题。
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
这也是语法糖(?)。
我能想到的最接近的事情是 Javascript - 你创建一个数组new Array()
,然后继续按数字或字符串值进行索引。由于您链接到的 Lua 文档中指出的原因,很可能是出于性能原因,一些 Javascript 实现选择使用两个数组来执行此操作。
ArrayWithHash是 C++ 中数组-哈希表混合的快速实现。
由于 C++ 是一种静态类型语言,因此 ArrayWithHash 中只允许使用整数键(无法插入字符串或指针键)。换句话说,它就像一个带有大索引哈希表备份的数组。它还使用不同的哈希表实现,这比 Lua 表实现的内存效率低。