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

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

其他语言中是否有类似的实现方式?

请看Lua 5.0实现文档第4节“表”。

Lua 5.1源代码-table.c

原文链接 https://stackoverflow.com/questions/2125654

点赞
stackoverflow用户6330
stackoverflow用户6330

我能想到最接近的是 JavaScript-您可以使用new Array()创建一个数组,然后通过数字或字符串值索引。可能由于性能原因,某些JavaScript实现选择使用两个数组来完成此操作,原因在您链接的Lua文档中提到。

2010-01-24 02:33:38
stackoverflow用户239657
stackoverflow用户239657

AWK 也可以做到这一点。

有趣的是,一些语言在操作上混淆了其他语言中不同的操作:

  • 列表索引 - a[10]
  • 关联索引 - a['foo']
  • 对象字段访问 - a.foo
  • 函数 / 方法调用 - a('foo') / a.foo()

一些不完整的示例:

  • Perl 是一种罕见的语言,在其中顺序 / 关联索引具有单独的语法 - a[10] / a{'foo'}。据我所知,对象字段映射到另外一种操作中的一种,这取决于类的实现者想使用哪个。

  • 在 Python 中,所有四个操作都是不同的;顺序 / 关联索引使用相同的语法,但是分别为它们优化了不同的数据类型。

  • 在 Ruby 中,对象字段是没有参数的方法 - a.foo

  • 在 JavaScript 中,对象字段 a.foo 是关联索引 a['foo'] 的语法糖。

  • 在 Lua 和 AWK 中,关联数组也用于顺序索引 - a[10]

  • Arc 中,顺序和关联索引类似于函数调用 - (a 10) / (a "foo"),我认为 a.foo 也是这种语法的语法糖(?)。

2010-01-24 08:46:11
stackoverflow用户41661
stackoverflow用户41661

这个想法最初是由Roberto Ierusalimschy和 Lua 团队提出的。我在2003年MIT轻量级语言研讨会上听到了Roberto关于这个想法的演讲,在这个演讲中他讨论了之前的工作,并有力地论证了这个想法是新的。我不知道是否有其他语言在此之后实现了这个想法。

原始版的Awk的语言模型比Lua略微受限。一个数组中只能使用数字或字符串作为键,但数组本身不是第一类值:数组必须有一个名称,而一个数组不能作为另一个数组的键。

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

我没有去深入调查所有后来的 Awk 实现,例如 Gnu Awk、mawk 等等。

2010-01-26 01:58:19
stackoverflow用户556899
stackoverflow用户556899

ArrayWithHash

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

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

2016-07-27 04:11:31