Lua的閉包詳解(終於搞懂了)

2022-06-22 01:48:09 字數 1533 閱讀 2066

詞法定界:當乙個函式內巢狀另乙個函式的時候,內函式可以訪問外部函式的區域性變數,這種特徵叫做詞法定界

table.sort(names,functin (n1,n2)

return grades[n1]>grades[n2]

end)

//內部匿名函式可以訪問外部函式的n1,n2

第一類值:lua當中函式是乙個值,他可以存在變數中,可以作為函式引數,可以作為返回值

function test()

local i=0

return function()

i++...

endend

//函式作為返回值,這裡的i也叫外部區域性變數,就是lua中的upvalue

閉包:通過呼叫含有乙個內部函式加上該外部函式持有的外部區域性變數(upvalue)的外部函式(就是工廠)產生的乙個例項函式

閉包組成:外部函式+外部函式建立的upvalue+內部函式(閉包函式)

例項:

function test()

local i=0

return function()//尾呼叫

i+=1

return i

endend

c1=test()

c2=test()//c1,c2是建立在同乙個函式,同乙個區域性變數的不同例項上面的兩個不同的閉包

//閉包中的upvalue各自獨立,呼叫一次test()就會產生乙個新的閉包

print(c1()) -->1

print(c1()) -->2//重複呼叫時每乙個呼叫都會記住上一次呼叫後的值,就是說i=1了已經

print(c2()) -->1//閉包不同所以upvalue不同

print(c2()) -->2

建立迭代器:(一定要注意迭代器只是乙個生成器,他自己本身不帶迴圈)

function list_iter(t)

local i=0

local n=table.getn(t)

return function()

i=i+1

if i<=n then return t[i] end

endend

//這裡的list_iter是乙個工廠,每次呼叫都會產生乙個新的閉包該閉包內部包括了upvalue(t,i,n)

使用迭代器:

while中使用:

t=iter=list_iter(t)//呼叫迭代器產生乙個閉包

while true do

local element=iter()

if element==nil then break end

print(element)

endend

泛型for使用:

t=for element in list_iter(t) do//這裡的list_iter()工廠函式只會被呼叫一次產生乙個閉包函式,後面的每一次迭代都是用該閉包函式,而不是工廠函式

print(element)

end

終於搞懂了鍊錶(頭結點的重要性 課後筆記)

此圖為上面 的實行結果,我反覆檢查了乙個小時,一次一次的試錯中,感覺怎麼檢查都沒錯的時候,我開始確定是最開始建立鍊錶的時候,是不是當時建立鍊錶就出現了問題,於是我開始檢查起鍊錶的迴圈輸入時,for迴圈的最後,我將p指向a,此時就代表將頭結點的p重新又將其指向了尾結點,這樣一來輸出的肯定是空啊,這時候...

終於搞懂了困惑已久的c語言中的關於指標的那幾個變數

學c語言時,學到指標時,理解不了指標,還老是把關於指標的變數弄混,接下來先看看 再解釋 中的錯誤,解釋之前,我想和你們通俗易懂的說說我在學習中經常弄混的幾個概念 下面說的星q 指的是 q 位址是什麼,指標又是什麼,而位址變數和指標變數一樣嗎,int p 中的p代表什麼,int q 中的q又代表什麼,...

Lua的upvalue和閉包

lua函式 可以被當成引數傳遞,也可以被當成結果返回 在函式體中仍然可以定義內嵌函式。lua閉包是lua函式生成的資料物件。每個閉包可以有乙個upvalue值,或者多個閉包共享乙個upvalue數值。如果函式f2定義在函式f1中,那麼f2為f1的內嵌函式,f1為f2的外包函式,外包和內嵌都具有傳遞性...