Lua解包错误?
2009-11-4 10:39:41
收藏:0
阅读:268
评论:2
我在 Lua 的 unpack 函数中遇到了一种奇怪的行为
table1 = {true, nil, true, false, nil, true, nil}
table2 = {true, false, nil, false, nil, true, nil}
a1,b1,c1,d1,e1,f1,g1 = unpack( table1 )
print ("table1:",a1,b1,c1,d1,e1,f1,g1)
a2,b2,c2,d2,e2,f2,g2 = unpack( table2 )
print ("table2:",a2,b2,c2,d2,e2,f2,g2)
输出:
table1: true nil true false nil nil nil
table2: true false nil nil nil nil nil
第二个 unpack 函数只提供到第一个 nil 值的参数。我可以接受这样的结果。 第一个表格提供了 4 个参数,其中一个在中间为 nil。它有 4 个非 nil 参数,但它们并不是被显示的那些。
请问有人可以解释这个现象吗? 这是使用 codepad.org 和 lua 5.1 尝试的。
原文链接 https://stackoverflow.com/questions/1672985
点赞
stackoverflow用户173806
问题可以通过指定unpack()
的开始和结束索引,并将table.maxn()
用作结束索引来简单解决问题:
table1 = {true, nil, true, false, nil, true, nil}
a1,b1,c1,d1,e1,f1,g1 = unpack( table1, 1, table.maxn(table1) )
print ("table1:",a1,b1,c1,d1,e1,f1,g1)
-->table1: true nil true false nil true nil
两个表处理方式不同的真正原因在于确定数组部分的长度的逻辑。
luaB_unpack()
函数使用luaL_getn()
,后者的定义是基于调用lua_objlen()
的luaH_getn()
进行的。luaH_getn()
查看数组的最后一个位置,如果它是nil
,则在表中执行二进制搜索以找到边界(“t[i]既不是nil,t[i + 1]是nil”)。对于数组末尾的二进制搜索是table1
和table2
处理方式不同的原因。
如果数组中的最后一个条目为nil
,那么这应该只是个问题。
来自《Lua编程》(第16页)(你应该买这本书)的解释: 当数组中有空洞(内部为nil的元素)时,长度运算符可能将这些nil元素之一假定为结尾标记。因此,您应该避免在可能包含空洞的数组上使用长度运算符。
unpack()
使用长度运算符lua_objlen()
,它“可能假定任何nil元素为数组的结尾”。
2009-11-04 23:18:02
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
2.2 - 值和类型
如果将
nil
给定到一个条目中,会破坏表的枚举,而且变量将无法正确初始化。下面是一个演示有问题行为的简单示例:
table1 = {true, false, nil, false, nil, true, nil} for k,v in ipairs(table1) do print(k, v) end
输出:
1 true 2 false >Exit code: 0