答案 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表实现的内存效率低。