濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > Lua中的閉包學(xué)習(xí)筆記

Lua中的閉包學(xué)習(xí)筆記

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

之前介紹 Lua 的數(shù)據(jù)類型時(shí),也提到過,Lua 的函數(shù)是一種“第一類值(First-Class Value)”。它可以:

存儲(chǔ)在變量或 table (例如模塊和面向?qū)ο蟮膶?shí)現(xiàn))里

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

t = { p = print }
t.p("just a test!")

作為實(shí)參(也稱其為“高階函數(shù)(higher-order function)”)傳遞給其他函數(shù)調(diào)用

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

t = {2, 3, 1, 5, 4}
table.sort(t, function(a, b) return (a > b) end)

作為其他函數(shù)的返回值

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

function fun1(x) return fun2(x) end

函數(shù)在 Lua 里“第一類值”的特性,使它成為一種靈活,極具彈性的數(shù)據(jù)類型,同時(shí),也讓它衍生出一些特殊的功能強(qiáng)大的語言機(jī)制:

閉包(closure)

Lua 中的函數(shù)是帶有詞法作用域(lexical scoping)的第一類值,也可以說是函數(shù)變量的作用域,即函數(shù)的變量是有一定的效用范圍的,變量只能在一定范圍內(nèi)可見或訪問到。

例如如下代碼:

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

function count()
    local uv = 0
    local function retfun()
        uv = uv + 1
        print(uv)
    end
    return retfun
end

上面函數(shù) retfun 定義在函數(shù) count 里,這里可以把函數(shù) retfun 看作是函數(shù) count 的內(nèi)嵌(inner)函數(shù),函數(shù) count 視為函數(shù) retfun 的外包(enclosing)函數(shù)。內(nèi)嵌函數(shù)能訪問外包函數(shù)已創(chuàng)建的所有局部變量,這種特征就是上面所說的詞法作用域,而這些局部變量(例如上面的變量 uv)則稱為該內(nèi)嵌函數(shù)的外部局部變量(external local variable)或 upvalue。

執(zhí)行函數(shù) count :

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

c1 = count()
c1()            -- 輸出 1
c1()            -- 輸出 2

上面兩次調(diào)用 c1,會(huì)看到分別輸出 1 和 2。

對(duì)于一個(gè)函數(shù) count 里的局部變量 uv,當(dāng)執(zhí)行完 "c1 = count()" 后,它的生命周期本該結(jié)束,但是因?yàn)樗殉闪藘?nèi)嵌函數(shù) retfun 的外部局部變量 upvalue,返回的內(nèi)嵌函數(shù) retfun 以 upvalue 的方式把 uv 的值保存起來,因此可以正確把值打印出來。

這種局部變量在函數(shù)返回后會(huì)繼續(xù)存在,并且返回的函數(shù)可以正常調(diào)用那個(gè)局部變量,獨(dú)立執(zhí)行其邏輯操作的現(xiàn)象,在 Lua 里稱之為閉包(closure)

之所以說閉包是一個(gè)獨(dú)立存在的個(gè)體,這個(gè)可以再把函數(shù) count 賦給一個(gè)變量,然后執(zhí)行看輸出效果:

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

c2 = count()
c2()                --  輸出 1

c1 跟 c2 都是相同的函數(shù)體,不過輸出的值卻不一樣!這主要還是因?yàn)殚]包是由相應(yīng)函數(shù)原型的引用和外部局部變量 upvalue 組成。當(dāng)調(diào)用函數(shù)造成 upvalue 值被改變時(shí),這只會(huì)改變對(duì)應(yīng)閉包的 upvalue 值,不會(huì)影響到其他閉包里的 upvalue 值,所以 c1 被調(diào)用 2 次后,外部局部變量 uv 的值的是 2,而新創(chuàng)建的 c2 初始的外部局部變量 uv 是 0,被調(diào)用之后會(huì)是 1。

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的閉包學(xué)習(xí)筆記》,本文關(guān)鍵詞  Lua,中的,閉包,學(xué)習(xí),筆記,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中的閉包學(xué)習(xí)筆記》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua中的閉包學(xué)習(xí)筆記的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    崇义县| 梁山县| 时尚| 新竹县| 康平县| 克什克腾旗| 永嘉县| 铁岭县| 肇庆市| 翼城县| 太和县| 武功县| 普兰店市| 岗巴县| 浙江省| 蕲春县| 田东县| 东兰县| 简阳市| 藁城市| 江源县| 桦川县| 奇台县| 色达县| 从化市| 安龙县| 周至县| 梓潼县| 襄汾县| 北辰区| 新源县| 昌乐县| 崇文区| 江津市| 绥滨县| 盐亭县| 长武县| 息烽县| 灵宝市| 偃师市| 会昌县|