麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > 綜合 > 正文

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

2024-07-21 23:04:21
字體:
供稿:網(wǎng)友

之前介紹 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。

對于一個(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ì)改變對應(yīng)閉包的 upvalue 值,不會(huì)影響到其他閉包里的 upvalue 值,所以 c1 被調(diào)用 2 次后,外部局部變量 uv 的值的是 2,而新創(chuàng)建的 c2 初始的外部局部變量 uv 是 0,被調(diào)用之后會(huì)是 1。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久精品国产一区二区 | 免费专区 - 91爱爱 | 国产精品99精品 | 国产一级在线观看视频 | jizzjizzjizz少妇 | 欧美人的天堂一区二区三区 | 成人艳情一二三区 | 欧美日韩经典在线 | 亚洲综合精品 | 少妇一级淫片免费放正片 | 国产精品视频海角社区88 | 一级免费| 久久人人爽人人爽人人片av高清 | 国产一级毛片高清视频完整版 | 成人毛片在线免费看 | 国产免费观看视频 | 涩涩屋av| 久久一级 | 久草干| 女人裸体让男人桶全过程 | 在线播放亚洲视频 | 特级黄aaaaaaaaa毛片 | 午夜影视一区二区 | 成人在线免费观看视频 | 黄视频网站免费 | 亚洲第一页综合 | 一本一本久久a久久精品综合小说 | 久久人人做 | 圆产精品久久久久久久久久久 | 欧美视频一区二区三区在线观看 | 色综合精品 | 精品国产一区二区三区久久久蜜月 | 日产精品久久久一区二区福利 | 亚州视频在线 | 免费黄色大片网站 | 国产女厕一区二区三区在线视 | 在线观看va | 欧美日韩大片在线观看 | 嫩呦国产一区二区三区av | 日韩视频一| chinese乱子伦xxxx国语对白 |