一些棘手的事情
有時候,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)
不同。
說預期價值的錯誤強烈表明這可能是問題的根源。