Lua的混合数组和哈希表;它存在于其他地方吗?
-
22-09-2019 - |
题
解决方案
这个想法是原件罗伯托·萨利姆斯和Lua的团队的其他成员。我听说罗伯托给在麻省理工学院轻量级语言车间谈论它于2003年,在这次谈话,他论述的现有工作,并令人信服地辩称,当时的想法是新的。我不知道是否因为其他语言都抄了一遍。
在原始awk有比的Lua稍微更受限制的语言模型;一个数字或字符串可以被用作在数组中的密钥,但阵列本身不是第一级值:阵列必须有一个名称,以及阵列不能被用作所述阵列中的键
关于实现中,我已检查了原始awk的来源由Brian Kernighan的维持,和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]
.在 弧, ,顺序索引和关联索引看起来像函数调用 -
(a 10)
/(a "foo")
, ,我认为a.foo
这也是语法糖(?)。
我能想到的最接近的是使用Javascript - 创建具有new Array()
阵列,然后或者通过数或字符串值进行到索引。它很可能是出于性能方面的一些JavaScript实现选择这样做,使用两个阵列,为Lua的文件中指出的理由链接到您。
ArrayWithHash 是C ++中的快速实现阵列的散列表杂交体。
由于C ++是一种静态类型语言,只有整数密钥在ArrayWithHash允许的(没有办法插入字符串或指针键)。换句话说,它是像与大指数的哈希表的备份阵列。此外,它使用不同的哈希表实现比的Lua表实现存储器效率更低。