就Lua閉包相關內容的淺談
目錄
1、博客內容
本篇爲Lua的學習筆記之一,就Lua閉包相關內容的淺談,首先本篇文章需要對Lua有基本的認識,之前文章就談過,博主學習東西一般是先學會怎麼用,等到用熟練了纔會再去深究其意,所以博主發的大多數文章都是在介紹用法而不是很底層的東西,博主也希望能通過很簡單直白的語言來介紹其用法,本篇博客主要作爲學習記錄。
2、內容
什麼是閉包:
我們知道Lua作爲一門腳本語言,寫法上是很寬泛的,我們可以在任意的地方去聲明方法變量,只不過是作用域的不同,那什麼是閉包呢,就博主的理解,方法內再內嵌方法的形式就可以稱之爲閉包,如下所示:
function outFunc()
function insideFunc()
-- body
end
end
但這並非是閉包的完整形態,insideFunc作爲outFunc的內嵌函數,通常情況下我們在外部是調用不到insideFunc,這個時候我們可以稍稍做些更改,將內嵌函數insideFunc作爲外部函數outFunc的返回值,我們就可以在外部通過調用outFunc來獲取內嵌函數,這個就是閉包最基本的內容,結構如下所示:
function outFunc()
function insideFunc()
--body
end
return insideFunc
end
閉包的作用:
以上我們知道了閉包是什麼,那麼現在我們來看看這個閉包能夠做什麼吧,首先我們在外部outFunc內聲明一個變量,並且在內嵌函數insideFunc內對該變量進行操作,結構如下所示:
function outFunc()
local testNum = 1
function insideFunc()
testNum = testNum*10
print("輸出:"..testNum)
end
return insideFunc
end
首先我們要知道一件事情,我們每次調用outFunc都會去新聲明一個testNum屬性和insideFunc方法,這些不同次調用所生成的testNum和insideFunc雖然名字相同,但是相互獨立,舉個例子,我們調用兩次outFunc,並用兩個變量來接受outFunc的返回值,再分別調用這兩個變量來查看結果,如下所示:
local func1 = outFunc()
local func2 = outFunc()
-------------------------調用並輸入結果
print(func1())
輸出:10
print(func1())
輸出:100
print(func2())
輸出:10
print(func1())
輸出:1000
我們分別用func1和func2來接受兩次調用outFunc的結果,也就是內嵌函數insideFunc,然後我們調用func1兩次,func2一次,再調用func1一次,我們發現調用func1後,他對內部的testNum進行了X10的操作,並且保存下來了這個記錄,當我們下次再調用func1時他內部的testNum就是從上次記錄下來的10進行操作,得出了結果100,之後我們調用func2獲取結果10,func2內部的testNum並不會受到func1的影響,這證明了其相互的獨立性。
看到這裏不知道有沒有人感到一種似曾相識的感覺,實例對不對,Lua是沒有面向對象這一概念的,在像其他語言如Java,C#等,我們可以對一個對象進行實例,實例後的新對象,有和原對象相同的屬性和方法,我們可以對其修改,那麼現在看來Lua的閉包和實例是何曾的相像,如此我們就可以知道閉包的作用之一就是來模擬面向對象,外層函數用來儲存變量和方法,內部變量方法實現對內部變量的修改。
3、推送
Github:https://github.com/KingSun5
4、結語
本篇博客是對閉包的淺談,下一篇博客的內容,博主將利用閉包和實現面向對象的過程,當然模擬面向對象只是閉包的作用之一,歡迎大家來補充閉包的其他作用,若是覺得博主的文章寫的不錯,不妨關注一下博主,點贊一下博文,另博主能力有限,若文中有出現什麼錯誤的地方,歡迎各位評論指摘。
QQ交流羣:806091680(Chinar)
該羣爲CSDN博主Chinar所創,推薦一下!我也在羣裏!