一些棘手的事情
有时候,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)
不同。
说预期价值的错误强烈表明这可能是问题的根源。