Lua的混合数组和哈希表;它在其他地方存在吗?
原文链接 https://stackoverflow.com/questions/2125654
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
也是这种语法的语法糖(?)。
这个想法最初是由Roberto Ierusalimschy和 Lua 团队提出的。我在2003年MIT轻量级语言研讨会上听到了Roberto关于这个想法的演讲,在这个演讲中他讨论了之前的工作,并有力地论证了这个想法是新的。我不知道是否有其他语言在此之后实现了这个想法。
原始版的Awk的语言模型比Lua略微受限。一个数组中只能使用数字或字符串作为键,但数组本身不是第一类值:数组必须有一个名称,而一个数组不能作为另一个数组的键。
关于实现,我查看了由Brian Kernighan维护的原始Awk的源代码,并发现Awk的实现使用了哈希表,而不是Lua的混合数组/表结构。这个区别很重要,因为在Lua中,当一个表与连续的整数键一起使用时,空间开销与C数组相同。在原始的Awk中是 不 成立的。
我没有去深入调查所有后来的 Awk 实现,例如 Gnu Awk、mawk 等等。
ArrayWithHash
ArrayWithHash 是一种在 C++ 中实现的快速数组-哈希表混合实现。
由于 C++ 是一种静态类型语言,因此在 ArrayWithHash 中只允许使用整数键(无法插入字符串或指针键)。换句话说,它类似于一个带有哈希表备份的大索引数组。此外,它还使用不同的哈希表实现,比 Lua 表实现的内存效率更低。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我能想到最接近的是 JavaScript-您可以使用
new Array()
创建一个数组,然后通过数字或字符串值索引。可能由于性能原因,某些JavaScript实现选择使用两个数组来完成此操作,原因在您链接的Lua文档中提到。