Lua的閉包詳解(轉)
阿新 • • 發佈:2018-12-18
為了便於更好地理解,例子進行了修改。首先要了解幾個概念和知識點:
- 詞法定界:當一個函式內巢狀另一個函式的時候,內函式可以訪問外部函式的區域性變數,這種特徵叫做詞法定界。
- lua當中函式可以是一個值,它可以存在變數中,可以作為函式引數,可以作為返回值。
- 閉包:通過呼叫含有一個內部函式加上該外部函式持有的外部區域性變數(upvalue)的外部函式(就是工廠)產生的一個例項函式
- 閉包組成:外部函式+外部函式建立的upvalue+內部函式(閉包函式)
例子:list_iter ()是一個迭代table的迭代器(再加個迴圈就是完整的)
function list_iter (t) local i = 0 local n = table.getn(t) return function() --內部匿名函式可以訪問外部函式的i和n, i = i + 1 --函式作為返回值, 這裡的i也叫外部區域性變數,就是lua中的upvalue if i <= n then return t[i] end end end
閉包中的upvalue各自獨立,呼叫一次test()就會產生一個新的閉包
function test() local i=0 return function() i = i + 1 return i end end c1=test() c2=test() --c1,c2是建立在同一個函式,同一個區域性變數的不同例項上面的兩個不同的閉包 print(c1()) -->1 print(c1()) -->2 --重複呼叫時每一個呼叫都會記住上一次呼叫後的值,就是說i=1了已經 print(c2()) -->1 --閉包不同所以upvalue不同 print(c2()) -->2