Lua 无法解压 table 以元素方式分配的两个 nil 开头
Lua can't unpack a table starts with two nil assigned elementwise
我在 Lua 中尝试了以下代码。前四种情况运行良好,但后两种情况失败。我在这两个结果中得到零。问题是什么?
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)
当使用 table 作为数组时,所有元素的值都必须不同于 nil
。
将键的值设置为 nil
会有效地从 table 中删除该键。但是在数组中,必须设置从 1 到该数组长度的所有整数键。 “空洞”是不允许的。所以你所有案例中的行为是未指定的。
您可以通过在 table:
中打印所有 key/value 对来验证
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?
我在 Lua 中尝试了以下代码。前四种情况运行良好,但后两种情况失败。我在这两个结果中得到零。问题是什么?
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)
当使用 table 作为数组时,所有元素的值都必须不同于 nil
。
将键的值设置为 nil
会有效地从 table 中删除该键。但是在数组中,必须设置从 1 到该数组长度的所有整数键。 “空洞”是不允许的。所以你所有案例中的行为是未指定的。
您可以通过在 table:
中打印所有 key/value 对来验证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?