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