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

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

请参阅第 4 节“表格” Lua 5.0的实现.

Lua 5.1 源代码 - table.c

有帮助吗?

解决方案

这个想法是原件罗伯托·萨利姆斯和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表实现存储器效率更低。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top