Lua的混合数组和哈希表;它存在于其他任何地方吗?

Posted

技术标签:

【中文标题】Lua的混合数组和哈希表;它存在于其他任何地方吗?【英文标题】:Lua's hybrid array and hash table; does it exist anywhere else? 【发布时间】:2011-01-08 16:47:23 【问题描述】:

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

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

查看The Implementation of Lua 5.0 中的第 4 节,表格。

Lua 5.1 Source Code - table.c

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

编辑:这没有回答关于实施的问题。

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 也是这个的语法糖(?)。

李>

【讨论】:

Fortress 和 Clojure 也将地图视为其键的函数,将数组视为其索引的函数。毕竟,他们 问题是关于实现,而不是语言模型。最初的 awk 仍然由 Brian Kernighan 维护,它使用哈希表。 你是对的,我完全错过了标记!不能对自己投反对票,所以对你的回答 +1。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于Lua的混合数组和哈希表;它存在于其他任何地方吗?的主要内容,如果未能解决你的问题,请参考以下文章

lua语言01:基础类型

Lua之table(表)

lua 性能优化

C ++中的哈希表?

为啥 Lua 数组(表)从 1 而不是 0 开始?

Lua表(table)的个人总结