löve2d #array不返回数组的最后一个整数索引

原始Lua代码(新的空项目):

local array = {12345}
array [3] = nil
array [4] = nil
print(#array) - 返回5

Löve2d代码(新的空项目):

function love.load()
    local array = {12345}
    array [3] = nil
    array [4] = nil
    print(#array) - 返回2(错误?)
end

这是正常运行还是错误?

Lua wiki说:#操作符不会计算表中的所有项(!)。相反,它会查找最后一个整数(非分数)键。

因此,我认为这是一个错误,但是我不确定,因为我对Lua和Löve2d相当新。

我将要在项目网站上报告这个可能的错误,但我想确保它是一个错误。

点赞
用户3885008
用户3885008

根据 The Length Operator # 的文档

长度操作符表示为一元操作符 #。一个字符串的长度是它的字节数(也就是说,在每个字符为一个字节的情况下字符串长度的常见含义)。

表 t 的长度被定义为任何整数索引 n,使得 t[n] 不为 nil 且 t[n+1] 为 nil。此外,如果 t[1] 为 nil,则可以将 n 设为零。对于一个常规数组,其非 nil 值的索引从 1 到给定的 n,则其长度恰好为 n,也就是其最后一个值的索引。如果数组中有“洞”(也就是,在其他非 nil 值之间有 nil 值),那么 #t可以是任何直接位于 nil 值之前的索引(也就是,它可以将任何此类 nil 值视为数组的末尾)。

强调是我的。这似乎是它的设计方式。任何nil都可以被视为数组的末尾。尽管看起来有些随意,但这似乎是_故意_的。

至于测试结果有差异,这可能与运行不同版本有关。请确保您对每个测试都使用相同的版本进行测试。

2017-01-14 13:34:35