詞法定界:當乙個函式內巢狀另乙個函式的時候,內函式可以訪問外部函式的區域性變數,這種特徵叫做詞法定界
table.sort(names,functin (n1,n2)第一類值:lua當中函式是乙個值,他可以存在變數中,可以作為函式引數,可以作為返回值return grades[n1]>grades[n2]
end)
//內部匿名函式可以訪問外部函式的n1,n2
function test()閉包:通過呼叫含有乙個內部函式加上該外部函式持有的外部區域性變數(upvalue)的外部函式(就是工廠)產生的乙個例項函式local i=0
return function()
i++...
endend
//函式作為返回值,這裡的i也叫外部區域性變數,就是lua中的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的外包函式,外包和內嵌都具有傳遞性...