gpt4 book ai didi

Lua解包bug?

转载 作者:行者123 更新时间:2023-12-04 01:48:14 32 4
gpt4 key购买 nike

我在 Lua 解包函数中偶然发现了一个奇怪的行为

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

第二个解包传递参数直到第一个 nil 值。我可以忍受。
第一张 table 提供 4?参数中间有一个为零。它有 4 个不是 nil 的参数,但它们不是显示的那个。

有人能解释一下吗?
这是用 codepad.org 和 lua 5.1 尝试过的

最佳答案

只需将开始和结束索引指定为 unpack() 即可解决该问题。并使用 table.maxn()作为结束索引:

table1 = {真,零,真,假,零,真,零}

a1,b1,c1,d1,e1,f1,g1 = unpack( table1, 1, table.maxn(table1) )
打印(“表1:”,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] 非零且 t[i+1] 为零”)。数组末尾的二分查找是 table1 的原因处理方式与 table2 不同.

如果数组中的最后一个条目是 nil,这应该只是一个问题。 .

来自 Programming in Lua (第 16 页)(你应该买这本书。):
当一个数组有洞——里面有 nil 元素时——长度操作符可以假设这些 nil 元素中的任何一个作为结束标记。因此,您应该避免在可能包含空洞的数组上使用长度运算符。
unpack()正在使用长度运算符 lua_objlen() ,它“可以假设任何 [the] nil 元素作为数组的结尾”。

关于Lua解包bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672985/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com