1. 程式人生 > >Lua的閉包詳解(轉)

Lua的閉包詳解(轉)

為了便於更好地理解,例子進行了修改。首先要了解幾個概念和知識點:

  1. 詞法定界:當一個函式內巢狀另一個函式的時候,內函式可以訪問外部函式的區域性變數,這種特徵叫做詞法定界。
  2. lua當中函式可以是一個值,它可以存在變數中,可以作為函式引數,可以作為返回值。
  3. 閉包:通過呼叫含有一個內部函式加上該外部函式持有的外部區域性變數(upvalue)的外部函式(就是工廠)產生的一個例項函式
  4. 閉包組成:外部函式+外部函式建立的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