Lua中的閉包

來源:互聯網
上載者:User


前言

在很多語言中都有閉包的概念,而在這裡,我將主要對Lua語言的閉包概念進行分析與總結。希望對大家學習Lua有協助。 什麼是閉包。

閉包在Lua中是一個非常重要的概念,閉包是由函數和與其相關的引用環境組合而成的實體。我們再來看一段代碼:

function newCounter()     local i = 0     return function () -- 匿名函數          i = i + 1          return i     endendc1 = newCounter()print(c1()) print(c1())

根據剛剛說的閉包的概念,結合上面的代碼,來說說這個概念。閉包=函數+引用環境。上述代碼中的newCounter函數返回了一個函數,而這個返回的匿名函數就是閉包的組成部分中的函數;引用環境就是變數i所在的環境。實際上,閉包只是在形式和表現上像函數,但實際上不是函數,我們都知道,函數就是一些可執行語句的組合體,這些代碼語句在函數被定義後就確定了,並不會再執行時發生變化,所以函數只有一個執行個體。而閉包在運行時可以有多個執行個體,不同的引用環境和相同的函數組合可以產生不同的執行個體,就好比相同的類代碼,可以建立不同的類執行個體一樣。在看別人的文章時,看到有這樣的說法:子函數可以使用父函數中的局部變數,這種行為就叫做閉包。這種說法其實就說明了閉包的一種表象,讓我們從外在形式上,能更好的理解什麼是閉包。至於深層次的閉包,我們接著繼續。 再看閉包

看過我部落格的朋友都清楚,我之前的部落格都是寫的關於C++的東西,對於學習C++的我,理解Lua的閉包時,確實存在一些“難度”。首先,在Lua中,建立一個函數,就像定義一個普通類型值一樣的,也就是我之前的博文中說的,Lua中的函數和和普通類型是沒有區別的。Lua中的函數就是所謂的“第一類值”,它可以被存放在變數或資料結構中,可以當做參數傳遞給另一個函數,可以是一個函數的傳回值,還可以在運行期間被建立。Lua中的函數就是這樣的一種“東西”,它很靈活。還記得我在《Lua中的函數》博文中提到的“非局部的變數”這個概念麼。這是一個非常很重要的概念,它可以理解為不是在局部作用範圍內定義的一個變數,同時,它又不是一個全域變數,也就是大家說的upvalue,由於有了這樣的一種變數的存在,就成全了Lua中的閉包。這種變數主要應用在嵌套函數和匿名函數裡。我們都知道,可以在Lua的函數中再定義函數,也就是內嵌函數,內嵌函數可以訪問外部函數已經建立的所有局部變數,而這些變數就被稱為該內嵌函數的upvalue,upvalue實際指的是變數而不是值,這些變數可以在內建函式之間共用,比如以下代碼:

function Fun1()     local iVal = 10          -- upvalue     function InnerFunc1()     -- 內嵌函數          print(iVal)          --     end     function InnerFunc2()     -- 內嵌函數          iVal = iVal + 10     end     return InnerFunc1, InnerFunc2end-- 將函數賦值給變數,此時變數a綁定了函數InnerFunc1, b綁定了函數InnerFunc2local a, b = Fun1()-- 調用aa()          -->10-- 調用bb()          -->在b函數中修改了upvalue iVal-- 調用a列印修改後的upvaluea()          -->20

上述這段簡單的代碼,就驗證了在內嵌函數中是共用upvalue的,就好比C++類中的成員函數可以訪問和修改成員變數一樣。 使用閉包

可以看到閉包是資料和行為的結合體,就好比C++中的類,這樣就使得閉包具有較好的抽象能力,在某些場合下,我們需要記住某次調用完成以後資料的狀態,就好比C++中的static類型的變數,每次調用完成以後,static類型的變數並不會被清除。使用閉包就可以很好的完成該功能,在下一篇博文中,我將會講到使用閉包完成迭代器功能。 總結

閉包是一個非常很總要的概念,也好理解,也難理解,簡單的說,閉包就是內嵌的函數加上它可以正確訪問的upvalue。很多時候,我們明白了這個道理,卻不會用這個東西,所以,我們需要閱讀更多的代碼,參加更多的項目,去積累更多的項目經驗,來豐富自己的閱曆,到時候,理解層次就會上去。




原文地址:http://www.jellythink.com/archives/498

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.