【问题标题】:Lua can't unpack a table starts with two nil assigned elementwiseLua 无法解压以两个 nil 分配元素开头的表
【发布时间】:2015-09-23 00:59:57
【问题描述】:

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

【问题讨论】:

    标签: lua lua-table unpack


    【解决方案1】:

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

    【讨论】:

    • 这就是手册不使用术语“数组”的原因。它将表描述为具有“序列”或没有序列。 # (length) 和 ipairs 在序列上工作得很好。 (# 甚至在非序列上都不是确定性的。)
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多