1.函數(shù)返回值丟失
在lua中娶桦,函數(shù)可以有多個返回值
function foo()
? ? return 1,2
end
print(foo())
此時輸出結(jié)果為
12
而在下面這種情況則會出現(xiàn)返回值丟失的問題
print(foo(),4)
輸出結(jié)果為
14
只接收到第一個返回值1踱蠢,第二個返回值2丟失。原因是當(dāng)函數(shù)的返回值作為另一個函數(shù)的參數(shù)時咪辱,如果其不是最后一個參數(shù)振劳,則僅取第一個返回值。為避免這種情況油狂,應(yīng)使其作為最后一個參數(shù)澎迎。
print(4,foo())
此時庐杨,輸出結(jié)果為
412
2.尾調(diào)函數(shù)的用法
在lua中使用遞歸時,很容易出現(xiàn)棧溢出夹供。原因是lua中的棧不是自動擴(kuò)展的,其有一個最大可用大小仁堪,如果最大可用大小超過了哮洽,就會出現(xiàn)不可預(yù)知的問題。我們可以在初始化lua時添加一句
lua_checkstack(L,1000);
將棧的最大可用容量設(shè)置為1000弦聂。
也可以使用尾調(diào)函數(shù)鸟辅,lua在調(diào)用尾調(diào)函數(shù)時,先是彈出當(dāng)前函數(shù)的椵汉空間匪凉,然后再調(diào)用尾調(diào)函數(shù),從而降低了函數(shù)層層調(diào)用過程中的棧消耗捺檬,非常使用于函數(shù)遞歸調(diào)用再层。
當(dāng)函數(shù)的最后返回結(jié)果時調(diào)用了另一個函數(shù),即為尾調(diào)函數(shù)
function f(x)
? ? return g(x)
end
以下幾種情況不是尾調(diào)用
1 return g(x)+1 --不是尾調(diào)函數(shù)堡纬,因為還必須做一次加法 操作
2 return (g(x)) --不是尾調(diào)函數(shù)聂受,因為必須調(diào)整為一個返回值
3 return x or g(x) --不是尾調(diào)函數(shù),因為還需要進(jìn)行比較的操作