Lua中的「尾調用」就是一種相似於goto的函數調用,當一個函數調用是另外一個函數的最後一個動做時,該調用纔算是一條「尾調用」。【一個函數在調用完另外一個函數以後,是否就無其餘事情須要作了】函數
function f(x) return g(x) end 也就是說,當f調用完g以後,f所表明的整個函數的調用纔算執行完成也就無其餘事情可作了。所以,這種狀況中,程序就不須要返回那個「尾調用」所在的函數了。 因此在「尾調用」以後,程序也不須要保存任何關於該函數的棧信息了。 當g返回時,執行控制權能夠直接返回到調用f的那個點上。
Lua中進行「尾調用」時不耗費任何棧空間。因此一個程序能夠擁有無數嵌套的「尾調用」。lua
function foo(n) if n > 0 then return foo(n - 1) end end 調用以上函數時,傳入任何數字做爲參數都不會形成棧溢出。
如下示例均不是「尾調用」spa
return g(x) + 1 ----必須作一次加法。 return x or g(x) ----必須調整爲一個返回值。 return (g(x)) ----必須調整爲一個返回值。 調用完一個函數以後就無需作其餘事情了。
在Lua中,只有「return <func> (<args>)」這樣的調用形式纔算是一條「尾調用」,Lua會在調用前對<func>及其參數求值,因此它們能夠是任意複雜的表達式。code
return x[i].foo(x[j] + a*b, i+j)
Lua中「尾調用」的一大應用就是編寫「狀態機」。這種程序一般以一個函數來表示一個狀態,改變狀態就是goto到另外一個特定的函數。io