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

首頁 > 開發 > 綜合 > 正文

Lua中的閉包小結

2024-07-21 23:04:11
字體:
來源:轉載
供稿:網友

前言

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

什么是閉包?

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

 

復制代碼 代碼如下:

function newCounter()
     local i = 0
     return function () -- 匿名函數
          i = i + 1
          return i
     end
end
 
c1 = 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, InnerFunc2
end
 
-- 將函數賦值給變量,此時變量a綁定了函數InnerFunc1, b綁定了函數InnerFunc2
local a, b = Fun1()
 
-- 調用a
a()          -->10
 
-- 調用b
b()          -->在b函數中修改了upvalue iVal
 
-- 調用a打印修改后的upvalue
a()          -->20

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

 

使用閉包

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧产日产国产精品v | 国产一区二区不卡 | 成人一级视频在线观看 | 免费高清一级欧美片在线观看 | 亚洲骚妻 | 99re66热这里只有精品8 | 欧美精品电影一区二区 | 日韩毛片免费观看 | 男女羞羞视频在线免费观看 | 中国美女一级黄色大片 | 亚洲国产精品久久久久久久久久 | 成人免费看视频 | 色视频欧美 | 久青草免费视频 | 欧美一区二区黄色 | 久久精品1区2区 | 18欧美性xxxx极品hd | 999久久国精品免费观看网站 | 叉逼视频 | 黄色高清av | 91中文在线观看 | 黑人操穴 | 日本在线免费观看视频 | 成人激情视频网站 | 国产乱一区二区三区视频 | 亚洲精品成人久久 | 精品国产一区二区三区成人影院 | 轻点插视频| 最近日本电影hd免费观看 | 国产九色在线观看 | 污视频在线免费播放 | 亚洲导航深夜福利涩涩屋 | 91精品国| 蜜桃91麻豆 | 成人免费网站在线观看视频 | 精品国产91久久久久久浪潮蜜月 | 97伦理| 免费欧美一级视频 | 日本精品久久久一区二区三区 | 91资源在线观看 | 成年性羞羞视频免费观看 |