一些棘手的事情

有时候,Lua 在阅读文档后的行为并不像人们想象的那样。其中一些案例是:

没有,没有什么不一样(常见的 PITFALL!)

正如预期的那样,table.insert(my_table, 20) 将值 20 添加到表中,table.insert(my_table, 5, 20) 在第 5 个位置添加值 20。虽然 table.insert(my_table, 5, nil) 做了什么?人们可能会认为它将 nil 视为没有参数,并在表的末尾插入值 5,但它实际上将值 nil 添加到表的第 5 个位置。什么时候出现这个问题?

(function(tab, value, position)
    table.insert(tab, position or value, position and value)
end)({}, 20)
-- This ends up calling table.insert({}, 20, nil)
-- and this doesn't do what it should (insert 20 at the end)

tostring() 类似的事情:

print (tostring(nil)) -- this prints "nil"
table.insert({}, 20) -- this returns nothing
-- (not nil, but actually nothing (yes, I know, in lua those two SHOULD
-- be the same thing, but they aren't))

-- wrong:
print (tostring( table.insert({}, 20) ))
-- throws error because nothing ~= nil

--right:
local _tmp = table.insert({}, 20) -- after this _tmp contains nil
print(tostring(_tmp)) -- prints "nil" because suddenly nothing == nil

使用第三方代码时,这也可能导致错误。例如,如果一些函数的文档说“如果幸运则返回甜甜圈,否则返回 nil”,实现可能看起来有点像这样

function func(lucky)
    if lucky then
        return "donuts"
    end
end

这个实现起初可能看似合理; 它必须返回甜甜圈,当你输入 result = func(false) 时,结果将包含值 nil

但是,如果有人写了 print(tostring(func(false))) lua 会抛出一个看起来有点像这个 stdin:1: bad argument #1 to 'tostring' (value expected) 的错误

这是为什么? tostring 显然得到了一个争论,尽管它是真的 14。错误。func 什么都不返回,所以 tostring(func(false))tostring() 相同而且与 tostring(nil) 不同。

预期价值的错误强烈表明这可能是问题的根源。

留下数组中的空白

如果你是 lua 的新手,这是一个巨大的陷阱,表格类别中有很多信息