最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年12月10日 11:46:18   投稿:junjie  
這篇文章主要介紹了Lua中的閉包學(xué)習(xí)筆記,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量),需要的朋友可以參考下

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

存儲在變量或 table (例如模塊面向?qū)ο?/a>的實現(xiàn))里

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

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

作為實參(也稱其為“高階函數(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ù)類型,同時,也讓它衍生出一些特殊的功能強大的語言機制:

閉包(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,會看到分別輸出 1 和 2。

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

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

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

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

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

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

相關(guān)文章

最新評論

镇安县| 玉田县| 苏州市| 达日县| 林芝县| 岳西县| 西平县| 兴山县| 黎平县| 永寿县| 山东省| 湖口县| 永泰县| 临沂市| 营口市| 民丰县| 吐鲁番市| 巴里| 洛宁县| 望江县| 原阳县| 富锦市| 富川| 扶绥县| 永福县| 邳州市| 彩票| 沅江市| 和龙市| 城步| 吉安市| 尖扎县| 阳春市| 比如县| 敦化市| 吉安市| 博白县| 堆龙德庆县| 建水县| 兴国县| 仪陇县|