lua語言中閉包的學習心得

2022-04-29 10:48:13 字數 2002 閱讀 7788

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 條件滿足後,就會導致該區域性變數的宣告...