Lua无法解包以两个nil元素开头的表

3
我在Lua中尝试了以下代码。前四种情况都很好,但是最后两种失败了。在这两种情况下,我得到的结果是nil。问题出在哪里?
v = {nil, 10, nil}
a, b, c = unpack(v)
-- Output: a, b, c =  nil 10  nil
print('a, b, c = ', a, b, c)

v = {nil, nil, 10}
a, b, c = unpack(v)
-- Output: a, b, c =  nil nil 10
print('a, b, c = ', a, b, c)

v = {}
v[2] = 10
a, b, c = unpack(v)
-- Output: a, b, c =  nil 10  nil 
print('a, b, c = ', a, b, c)

v = {}
v[1] = nil
v[2] = 10
v[3] = nil
a, b, c = unpack(v)
-- Output: a, b, c =  nil 10  nil
print('a, b, c = ', a, b, c)

v = {}
v[3] = 10
a, b, c = unpack(v)
-- Output: a, b, c =  nil nil nil
print('a, b, c = ', a, b, c)

v = {}
v[1] = nil
v[2] = nil
v[3] = 10
a, b, c = unpack(v)
-- Output: a, b, c =  nil nil nil
print('a, b, c = ', a, b, c)
1个回答

3
当将表格用作数组时,所有元素都需要具有不同于nil的值。
将键的值设置为nil将有效地从表格中删除该键。但在数组中,必须设置从1到该数组长度的所有整数键。不允许存在“空洞”。因此,在所有情况下的行为是未指定的。
您可以通过打印表格中的所有键/值对来进行验证:
t = {0, nil, 2, 3}

print("pairs:")
for k, v in pairs(t) do
    print("["..k.."]", v)
end

请注意,ipairs 会因为它停在第一个 nil 元素而中断。

print("ipairs:")
for k, v in ipairs(t) do
    print("["..k.."]", v)
end

您的情况可以参考这里的回答: Lua unpack 的 bug ?


1
这就是为什么手册没有使用术语“数组”的原因。它将表描述为具有“序列”或不具有序列。#(长度)和ipairs在序列上运行良好。(#甚至在非序列上也不确定。) - Tom Blodget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接