lua語言有如下兩個特點:
1.lua中的函式可以被存放在變數、表中,也可以作為函式的引數,還可以作為函式的返回值,如:
func = function()
print("hello");
end等價於
function func()
print("hello");
end這兩種寫法都是函式func()的定義;並且下面這個例子:
function func()
return function() print("hello"); end --函式作為返回值
endlocal f1 = func();
print(f1); --執行結果:function:00379738
f1(); --執行結果:hello
是函式作為函式返回值的情況,其中f1是func()內部返回的函式,列印出來為函式在記憶體中的位址,f1()呼叫了內部函式,執行後列印出了"hello"結果。
2.被巢狀的函式可以訪問他外部函式中的變數(這個比較強悍,c語言只能訪問全域性的或以引數形式傳入)。
看如下例子:
function func()
local index = 0;
local inner = function()
print(index);
index = index + 1;
endinner(); --列印結果:0
inner(); --列印結果:1
print(index); --列印結果:2
endfunc();
說明了func()中的區域性變數index是可以在inner()中被使用和更改的,index被稱為inner()的upvalue。
以上這兩點是構成閉包的基礎,也是lua語言的強大和靈活之處。
另外,將上面例子稍加改造,如下:
function func()
local index = 0;
print("hello");
return function()
print(index);
index = index + 1;
endend
local inner = func(); --呼叫func()函式,返回內部函式給inner,列印結果:"hello"
print(inner); --列印結果:function:0037be88
inner(); --呼叫內部函式,列印結果:0
inner(); --呼叫內部函式,列印結果:1
local other = func(); --獲取另乙個內部函式例項,列印結果:"hello"
other(); --呼叫另乙個內部函式例項,列印結果:0
other(); --同上,列印結果:1
由此可以看出函式的區域性變數是可以儲存在函式內部的,通過呼叫該函式內嵌的函式可以獲取並修改區域性變數的值,該函式的區域性變數(upvalue)和內嵌函式的組合使用,形成了閉包,這看起來與c++中類的成員變數有些類似。函式具有閉包的功能後,不必再擔心其區域性變數沒辦法儲存了,這一點對程式設計師的影響是很大的。
還有如下例子:
function func();
local index = 0;
return function()
index = index + 1;
return index;
endend
local inner = func();
print(inner()); --列印結果:1
print(inner()); --列印結果:2
呼叫了func()的內部函式例項,並將函式呼叫結果列印了出來,是個很好的儲存區域性變數的方式。
另外閉包常用於泛型for的迭代器中,由於太晚了,就不再贅述了。有問題歡迎討論拍磚。
go語言中閉包
閉包 closure 在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。golang的閉包 函式在golang中是 一等公民 ...
GO語言中的閉包
package main import fmt import fmt func main r res fmt.println r 1 r2 res fmt.println r2 2 r3 res fmt.println r3 3 乙個外層函式中有內層函式,該內層函式中,會操作外層函式的區域性變數 外...
go語言中的閉包結構
每次呼叫 increment都會重新生成乙個閉包結構中的變數 內層函式 外層函式區域性變數 可以是入參或者定義的區域性變數 閉包結構 如果將乙個內層函式作為函式返回值 內層函式中又涉及到外層函式的區域性變數 自己定義或者外部傳進來的引數,都是區域性變數 1 2 條件滿足後,就會導致該區域性變數的宣告...