就Lua閉包相關內容的淺談

                                     就Lua閉包相關內容的淺談


目錄

1、博客內容

2、內容

什麼是閉包:

閉包的作用:

3、推送

4、結語


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所創,推薦一下!我也在羣裏!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章