Lua 不能解压以两个 nil 元素开始的表

标签 lua lua-table unpack

我在 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)

最佳答案

将表用作数组时,所有元素的值都必须不同于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?

关于Lua 不能解压以两个 nil 元素开始的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32729374/

相关文章:

按键对 Lua 表进行排序

python - 将不同大小的数据打包到无符号整数列表中

loops - 操作 Lua 表时遇到问题

logging - 如何识别 Lua 脚本正在哪个线程上运行?

Lua - 尝试调用全局(nil 值)

lua - 使用LUA脚本和SCAN命令来获取列表?

c++ - 如何从 Lua 函数中获取多个返回表?

windows - 如何创建 .BAT 文件以下载和解压缩 zip 文件?

python - lambda 参数解包错误

Lua脚本错误,同时用redis放置行注释