Lua中的閉包學習筆記_Lua

來源:互聯網
上載者:User

之前介紹 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)函數。內嵌函數能訪問外包函數已建立的所有局部變數,這種特徵就是上面所說的詞法範圍,而這些局部變數(例如上面的變數 uv)則稱為該內嵌函數的外部局部變數(external local variable)或 upvalue。

執行函數 count :

複製代碼 代碼如下:

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

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

對於一個函數 count 裡的局部變數 uv,當執行完 "c1 = count()" 後,它的生命週期本該結束,但是因為它已成了內嵌函數 retfun 的外部局部變數 upvalue,返回的內嵌函數 retfun 以 upvalue 的方式把 uv 的值儲存起來,因此可以正確把值列印出來。

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

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

複製代碼 代碼如下:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.