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的混合数组和哈希表;它存在于其他任何地方吗?的主要内容,如果未能解决你的问题,请参考以下文章