Lua解压bug?

Geg*_*jja 11 lua unpack

我在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)
Run Code Online (Sandbox Code Playgroud)

输出:

table1: true    nil true    false   nil nil nil
table2: true    false   nil nil nil nil nil
Run Code Online (Sandbox Code Playgroud)

第二个unpack传递的参数高达第一个零值.我可以忍受这个.第一张表提供4张?参数中间有一个为零.它有4个参数不是nil,但它们不是显示的参数.

有人能解释一下吗?这是使用codepad.org和lua 5.1进行的

gwe*_*ell 16

只需通过指定开始和结束索引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]为非零和T [1 + 1]是零").对数组末尾的二进制搜索table1是以不同方式处理的原因table2.

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

来自Lua的编程(第16页)(你应该买这本书.): 当一个数组有空洞 - 其中有无元素时 - 长度算子可以假设这些无元素中的任何一个作为结束标记.因此,应避免在可能包含孔的数组上使用length运算符.

unpack()是使用长度运算符lua_objlen(),其中"可以采用任何的[该]零元件作为结束"的阵列构成.