上一篇我們簡單地介紹了Lua的函數(shù),這次,我們來點特別的,來介紹一下Lua的函數(shù)(小若:等等,我是不是錯過了什么?)
1.閉合函數(shù)(closure)
理論上來說,Lua的所有函數(shù)都應(yīng)該稱之為閉合函數(shù),但是,這種反人類的做法,我們還是拋棄吧~
按書上的描述,一個閉合函數(shù)就是:一個函數(shù)加上該函數(shù)所需訪問的所有”非局部的變量“。
理論什么的,很煩人,來看看一個函數(shù):
這個count函數(shù)會返回另外一個函數(shù),重點是,這個返回的函數(shù)會使用count函數(shù)的局部變量。
先來運行,看看效果,使用如下方式調(diào)用:
輸出結(jié)果如下:
再來回到定義,count函數(shù)里的那個函數(shù),加上非局部變量i,就構(gòu)成了一個閉合函數(shù)了,就這么簡單。
對于閉合函數(shù)而已,屬于它的非局部變量,并不是在調(diào)用它的時候臨時產(chǎn)生的,而是和它一起存在的。
所以每次調(diào)用閉合函數(shù),非局部變量的值都不會被重置。
如果大家還是不太清楚,那么,我們給這個閉合函數(shù)添加一個局部變量吧,修改count函數(shù)如下:
這次,把i作為這個內(nèi)部函數(shù)的局部變量了,它不再是“非局部變量”。
仍然像這樣調(diào)用:
輸出結(jié)果如下:
2.非全局函數(shù)
又是這種看著就反人類的名詞,非全局,那就是說,不是全局的函數(shù)(小若:廢你個話啊?。?/p>
來看看這樣的一個函數(shù):
這就是一個非全局函數(shù),但,這么簡單的東西我可不會拿出來說~
這里我想介紹一個“語法糖”,上面的mutou函數(shù),其實相當(dāng)于以下的代碼:
這就是我們函數(shù)的真實面貌,函數(shù)名稱其實也是一個變量名而已。
所以,有時候,我們在定義函數(shù)的時候,要注意一下順序。比如,這樣的兩個函數(shù):
mutou函數(shù)里要調(diào)用pangbai函數(shù)。
在編譯的時候,mutou函數(shù)是編譯不過的,因為這個時候pangbai函數(shù)未定義,換句話說,pangbai變量并不存在。
只要換一個方式就可以解決這個問題了:
這樣編譯就沒問題了,好吧,也許Lua里不該叫編譯,反正,不會報語法錯誤了~
3.尾調(diào)用
好了,一個名詞比一個名詞要反人類。
尾調(diào)用的大致意思是:一個函數(shù)的調(diào)用是另一個函數(shù)的最后一個動作時,這個調(diào)用就稱之為尾調(diào)用。
比如這樣的函數(shù):
當(dāng)mutou函數(shù)調(diào)用完count函數(shù)之后,就沒有其他事情要做了,所以,調(diào)用count函數(shù),就屬于尾調(diào)用。
但,如果是這樣的函數(shù):
這就不屬于尾調(diào)用,因為調(diào)用完count函數(shù)之后,還要取得count的返回值,然后進行一次加法操作,這就不符合定義了。
尾調(diào)用有什么意義呢?
進行尾調(diào)用時不會耗費多余的??臻g,比如這樣一個經(jīng)典的函數(shù):
我們可以試試這樣調(diào)用:
運行的時候,就會報這樣的一個錯誤: [string "src/main.lua"]:57: stack overflow
由于我用Lua的情況不多,所以暫時沒有舉個比較實用的例子,但,這自然會是一個很好用的特性。
好了,關(guān)于Lua的函數(shù),應(yīng)該都介紹完了,我也是按著書的順序在過一遍基礎(chǔ),然后把覺得有意思的部分用文章記錄下來。
標(biāo)簽:黑龍江 延邊 江西 張掖 新余 宜賓 武漢 嘉峪關(guān)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的閉合函數(shù)、非全局函數(shù)與函數(shù)的尾調(diào)用詳解》,本文關(guān)鍵詞 Lua,中的,閉合,函數(shù),非,全局,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。下一篇:Lua中的迭代器淺析