主頁(yè) > 知識(shí)庫(kù) > Lua中的閉包小結(jié)

Lua中的閉包小結(jié)

熱門標(biāo)簽:冀州市地圖標(biāo)注 漳州智云呼電話機(jī)器人 武漢外呼防封系統(tǒng)多少錢 百度地圖標(biāo)注早餐區(qū)域 地圖標(biāo)注大廈 新岸線智能電銷機(jī)器人 個(gè)人怎么在地圖標(biāo)注需要的店鋪 怎么去除地圖標(biāo)注 清朝地圖標(biāo)注哈爾濱

前言

在很多語(yǔ)言中都有閉包的概念,而在這里,我將主要對(duì)Lua語(yǔ)言的閉包概念進(jìn)行分析與總結(jié)。希望對(duì)大家學(xué)習(xí)Lua有幫助。

什么是閉包?

閉包在Lua中是一個(gè)非常重要的概念,閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。我們?cè)賮?lái)看一段代碼:

復(fù)制代碼 代碼如下:

function newCounter()
     local i = 0
     return function () -- 匿名函數(shù)
          i = i + 1
          return i
     end
end
 
c1 = newCounter()
print(c1())
print(c1())

根據(jù)剛剛說(shuō)的閉包的概念,結(jié)合上面的代碼,來(lái)說(shuō)說(shuō)這個(gè)概念。閉包=函數(shù)+引用環(huán)境。上述代碼中的newCounter函數(shù)返回了一個(gè)函數(shù),而這個(gè)返回的匿名函數(shù)就是閉包的組成部分中的函數(shù);引用環(huán)境就是變量i所在的環(huán)境。實(shí)際上,閉包只是在形式和表現(xiàn)上像函數(shù),但實(shí)際上不是函數(shù),我們都知道,函數(shù)就是一些可執(zhí)行語(yǔ)句的組合體,這些代碼語(yǔ)句在函數(shù)被定義后就確定了,并不會(huì)再執(zhí)行時(shí)發(fā)生變化,所以函數(shù)只有一個(gè)實(shí)例。而閉包在運(yùn)行時(shí)可以有多個(gè)實(shí)例,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實(shí)例,就好比相同的類代碼,可以創(chuàng)建不同的類實(shí)例一樣。在看別人的文章時(shí),看到有這樣的說(shuō)法:子函數(shù)可以使用父函數(shù)中的局部變量,這種行為就叫做閉包!這種說(shuō)法其實(shí)就說(shuō)明了閉包的一種表象,讓我們從外在形式上,能更好的理解什么是閉包。至于深層次的閉包,我們接著繼續(xù)。

再看閉包

看過(guò)我博客的朋友都清楚,我之前的博客都是寫的關(guān)于C++的東西,對(duì)于學(xué)習(xí)C++的我,理解Lua的閉包時(shí),確實(shí)存在一些“難度”。首先,在Lua中,創(chuàng)建一個(gè)函數(shù),就像定義一個(gè)普通類型值一樣的,也就是我之前的博文中說(shuō)的,Lua中的函數(shù)和和普通類型是沒(méi)有區(qū)別的。Lua中的函數(shù)就是所謂的“第一類值”,它可以被存放在變量或數(shù)據(jù)結(jié)構(gòu)中,可以當(dāng)做參數(shù)傳遞給另一個(gè)函數(shù),可以是一個(gè)函數(shù)的返回值,還可以在運(yùn)行期間被創(chuàng)建。Lua中的函數(shù)就是這樣的一種“東西”,它很靈活。還記得我在《Lua中的函數(shù)》博文中提到的“非局部的變量”這個(gè)概念么?這是一個(gè)非常很重要的概念,它可以理解為不是在局部作用范圍內(nèi)定義的一個(gè)變量,同時(shí),它又不是一個(gè)全局變量,也就是大家說(shuō)的upvalue,由于有了這樣的一種變量的存在,就成全了Lua中的閉包。這種變量主要應(yīng)用在嵌套函數(shù)和匿名函數(shù)里。我們都知道,可以在Lua的函數(shù)中再定義函數(shù),也就是內(nèi)嵌函數(shù),內(nèi)嵌函數(shù)可以訪問(wèn)外部函數(shù)已經(jīng)創(chuàng)建的所有局部變量,而這些變量就被稱為該內(nèi)嵌函數(shù)的upvalue,upvalue實(shí)際指的是變量而不是值,這些變量可以在內(nèi)部函數(shù)之間共享,比如以下代碼:

復(fù)制代碼 代碼如下:

function Fun1()
     local iVal = 10          -- upvalue
     function InnerFunc1()     -- 內(nèi)嵌函數(shù)
          print(iVal)          --
     end
 
     function InnerFunc2()     -- 內(nèi)嵌函數(shù)
          iVal = iVal + 10
     end
 
     return InnerFunc1, InnerFunc2
end
 
-- 將函數(shù)賦值給變量,此時(shí)變量a綁定了函數(shù)InnerFunc1, b綁定了函數(shù)InnerFunc2
local a, b = Fun1()
 
-- 調(diào)用a
a()          -->10
 
-- 調(diào)用b
b()          -->在b函數(shù)中修改了upvalue iVal
 
-- 調(diào)用a打印修改后的upvalue
a()          -->20

上述這段簡(jiǎn)單的代碼,就驗(yàn)證了在內(nèi)嵌函數(shù)中是共享upvalue的,就好比C++類中的成員函數(shù)可以訪問(wèn)和修改成員變量一樣。

使用閉包

可以看到閉包是數(shù)據(jù)和行為的結(jié)合體,就好比C++中的類,這樣就使得閉包具有較好的抽象能力,在某些場(chǎng)合下,我們需要記住某次調(diào)用完成以后數(shù)據(jù)的狀態(tài),就好比C++中的static類型的變量,每次調(diào)用完成以后,static類型的變量并不會(huì)被清除。使用閉包就可以很好的完成該功能,在下一篇博文中,我將會(huì)講到使用閉包完成迭代器功能。

總結(jié)

閉包是一個(gè)非常很總要的概念,也好理解,也難理解,簡(jiǎn)單的說(shuō),閉包就是內(nèi)嵌的函數(shù)加上它可以正確訪問(wèn)的upvalue。很多時(shí)候,我們明白了這個(gè)道理,卻不會(huì)用這個(gè)東西,所以,我們需要閱讀更多的代碼,參加更多的項(xiàng)目,去積累更多的項(xiàng)目經(jīng)驗(yàn),來(lái)豐富自己的閱歷,到時(shí)候,理解層次就會(huì)上去。

您可能感興趣的文章:
  • Lua學(xué)習(xí)筆記之表和函數(shù)
  • Lua進(jìn)階教程之閉包函數(shù)、元表實(shí)例介紹
  • Lua基礎(chǔ)教程之賦值語(yǔ)句、表達(dá)式、流程控制、函數(shù)學(xué)習(xí)筆記
  • Lua中的閉包學(xué)習(xí)筆記
  • LUA中的閉包(closure)淺析
  • Lua學(xué)習(xí)筆記之函數(shù)、變長(zhǎng)參數(shù)、closure(閉包)、select等
  • lua閉包的理解以及表與函數(shù)的幾種表達(dá)方法

標(biāo)簽:天門 天門 德宏 臺(tái)灣 儋州 宣城 金昌 濰坊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的閉包小結(jié)》,本文關(guān)鍵詞  Lua,中的,閉包,小結(jié),Lua,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中的閉包小結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Lua中的閉包小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章