一些棘手的事情

有時候,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 的新手,這是一個巨大的陷阱,表格類別中有很多資訊