LUA中的閉包(closure)淺析
之前對(duì)closure一知半解,在網(wǎng)上也找不到一篇文章能把它說(shuō)清楚,今天好像第一次對(duì)它有點(diǎn)清晰的了解 了,寫(xiě)個(gè)BLOG記念一下
lua的函數(shù)是一種 First-Class Value 的東西, 到底是啥?
就是它們與傳統(tǒng)類(lèi)型的變值沒(méi)啥區(qū)別,
可以 存到一個(gè)變量中,
可以 存到table中,
可以 作為實(shí)參傳遞給其它函數(shù),
可以 作為其它函數(shù)的返回值.
它們還具有特定的詞法域(Lexical Scoping), 也就是說(shuō), 一個(gè)函數(shù)可以嵌套在另一個(gè)函數(shù)中, 內(nèi)部的函數(shù)可以訪(fǎng)問(wèn)外部函數(shù)中的變量.
如下面的例子:
function test(x)
return function (value)
return value * x
end
end
func = test(10)
print( func(11) )
在test()中,嵌套了一個(gè)匿名函數(shù)作為返回值, 而在這個(gè)匿名函數(shù)中 可以訪(fǎng)問(wèn)外部的 value 變量
再看另一個(gè)例子
function newCounter()
local i = 0
func = function()
i = i + 1
return i
end
return func
end
c = newCounter()
print(c())
print(c())
c1 = newCounter()
print(c1())
print(c1())
代碼中, 函數(shù) func 里訪(fǎng)問(wèn)了一個(gè) "非局部的變量" i, 用于保存一個(gè)計(jì)數(shù)器
初步看,由于創(chuàng)建變量i的函數(shù) newCounter 已經(jīng)返回, 所以每次調(diào)用 func 時(shí), 應(yīng)該是超過(guò)了作用范圍
其實(shí)不然, lua 會(huì)以 closure 的概念來(lái)處理這種情況.
一個(gè) closure 就是一個(gè)函數(shù)加上該函數(shù)所需訪(fǎng)問(wèn)的所有"非局部的變量"
所以上例中 c1, c2 是同個(gè)函數(shù)所創(chuàng)建的兩個(gè)不同的 closure, 它們各自擁有局部變量i的獨(dú)立實(shí)例.
從技術(shù)上來(lái)講, lua中只有 closure, 而不存在"函數(shù)". 因?yàn)?函數(shù)"本身就是一種特殊的 closure.
后記,C++的類(lèi)對(duì)象不也可以達(dá)到類(lèi)似的效果?
相關(guān)文章
實(shí)例講解Lua中pair和ipair的區(qū)別
這篇文章主要介紹了實(shí)例講解Lua中pair和ipair的區(qū)別,本文直接用實(shí)例代碼來(lái)講解pair和ipair的區(qū)別,需要的朋友可以參考下2015-04-04