欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Lua中的閉包學習筆記

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

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

存儲在變量或 table (例如模塊面向對象的實現)里

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

作為其他函數的返回值

復制代碼 代碼如下:

function fun1(x) return fun2(x) end

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

閉包(closure)

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

例如如下代碼:

復制代碼 代碼如下:

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

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

執(zhí)行函數 count :

復制代碼 代碼如下:

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

上面兩次調用 c1,會看到分別輸出 1 和 2。

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

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

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

復制代碼 代碼如下:

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

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

相關文章

  • Lua中使用table.concat連接大量字符串實例

    Lua中使用table.concat連接大量字符串實例

    這篇文章主要介紹了Lua中使用table.concat連接大量字符串實例,本文是Lua處理大量字符串的一個測試文章,測試了2種方法處理大量字符串的消耗時間,需要的朋友可以參考下
    2014-09-09
  • OpenResty中正則模式匹配的2種方法詳解

    OpenResty中正則模式匹配的2種方法詳解

    在 OpenResty 中,同時存在兩套正則表達式規(guī)范:Lua 語言的規(guī)范和 Nginx 的規(guī)范,下面這篇文章主要給大家介紹了關于OpenResty中正則模式匹配的2種方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-04-04
  • Lua元表與元方法實例講解

    Lua元表與元方法實例講解

    這篇文章主要介紹了Lua元表與元方法實例講解,本文講解了算術類、關系類元方法、table訪問的元方法等內容,需要的朋友可以參考下
    2014-09-09
  • Lua中使用table實現的其它5種數據結構

    Lua中使用table實現的其它5種數據結構

    這篇文章主要介紹了Lua中使用table實現的其它5種數據結構,本文用table為基礎,實現了數組、鏈表、隊列、集合等數據類型,需要的朋友可以參考下
    2014-09-09
  • Lua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下
    2014-09-09
  • Lua腳本實現遞歸刪除一個文件夾

    Lua腳本實現遞歸刪除一個文件夾

    這篇文章主要介紹了Lua腳本實現遞歸刪除一個文件夾,本文給出了C++和Lua兩個版本的實現代碼,需要的朋友可以參考下
    2015-05-05
  • lua腳本語言快速入門教程

    lua腳本語言快速入門教程

    這篇文章主要介紹了lua腳本語言快速入門教程,本文講解了變量及常量、字符串、邏輯控制語句、循環(huán)結構、函數及其使用等內容,需要的朋友可以參考下
    2015-03-03
  • Lua教程(十六):系統(tǒng)庫(os庫)

    Lua教程(十六):系統(tǒng)庫(os庫)

    這篇文章主要介紹了Lua教程(十六):系統(tǒng)庫(os庫)本文著重講解了OS庫中的日期和時間操作和其他系統(tǒng)調用兩部份內容,需要的朋友可以參考下
    2015-04-04
  • Lua字符串模式匹配函數小結

    Lua字符串模式匹配函數小結

    這篇文章主要介紹了Lua字符串模式匹配函數小結,本文涉及一些正則操作,需要的朋友可以參考下
    2014-11-11
  • Lua教程(二):語法約定

    Lua教程(二):語法約定

    這篇文章主要介紹了Lua教程(二):語法約定,本文講解了lua保留關鍵字、使用的標點符號、字符串、ASCII 碼等,需要的朋友可以參考下
    2015-03-03

最新評論