Lua for 迭代器和閉包

2021-09-28 21:56:02 字數 2554 閱讀 3994

for迴圈分為兩種:數值型(numerical)for和泛型(generic)for

1、數值型for

語法如下:

for var = exp1, exp2, exp3 do

something

end上述迴圈中,var的作用範圍為for迴圈內部,其值從exp1變化到exp2之前,每次迴圈都會執行something,並在每次迴圈結束後將步長(step)exp3增加到var上。第三個引數exp3為可選,不存在則設步長為1。若不想給迴圈設定上限,可以使用常量math.huge。

2、泛型for

在講泛型for之前,先回顧一下迭代器和閉包。

所有的迭代器都需要在連續的呼叫之間儲存一些狀態,這樣才能知道當前迭代所處的位置,及如何從當前位置步進到下一位置。而閉包則為儲存狀態提供了一種良好的機制。注意此處,乙個閉包就是乙個可以訪問其自身環境中乙個或多個區域性變數的函式。這些變數將連續呼叫過程中的值並將其儲存在閉包中,從而使得閉包記住迭代所處的位置。

泛型for語法:

for var-list in exp-list do

body

end其中,var-list為變數名列表,exp-list為表示式列表,兩者都以逗號隔開。特殊的是,變數列表的第乙個變數成為控制變數,其值永遠不為nil,因為為nil時迴圈已經結束了。

泛型for要做的第一件事就是對 exp-list 求值,這些表示式應該返回三個值供泛型for儲存:

1、迭代函式

2、不可變狀態

3、控制變數初始值

無狀態迭代器

顧名思義,無狀態迭代器就是一種不需要儲存任何狀態的迭代器。因此在多個迴圈中可以使用同乙個迭代器,從而避免了建立閉包的開銷,讓**在效能上得到了提公升。ipairs就是乙個典型的無狀態迭代器,例如:

t = 

for k,v in ipairs(t) do

print(k,v)

end

迭代的狀態由正在被遍歷的表(乙個不可變狀態,不會在迴圈中改變)及當前的索引值(控制變數)組成。ipairs(工廠)和迭代器都很簡單,我們可以用lua語言編寫出來:

local function self_iter(t, i)

-- body

print("execute:"..i)

i = i + 1

local v = t[i]

if v then

return i, v

endendfunction self_ipairs(t)

-- body

print("set up")

return self_iter, t, 0

endfor i, v in self_ipairs() do

print(i, v)

endprint("********************=我是分界線******************************")

執行結果:

set up

execute:0

1 this

execute:1

2 is

execute:2

3 test

execute:3

4 code

execute:4

********************=我是分界線******************************

當呼叫for迴圈中的self_ipairs(t)時,self_ipairs(t)會返回三個值,即迭代函式self_iter、不可改變狀態表t、控制變數的初始值0。

之後,lua語言呼叫iter(t,0),得到1,t[1](除非t[1]已經變成了nil),第二次迭代,lua語言呼叫iter(t,1),得到2,t[2],以此類推,直至得到第乙個為nil的元素。

pairs函式也是乙個無狀態迭代器,它呼叫的是lua中乙個基本函式:next(t, k)

function pairs(t)

return next, t, nil

end

k是表t的乙個鍵。next(t, k)的返回值有兩個:

1、隨機次序返回k的下乙個鍵,當key==nil的時候返回表中的第乙個鍵,當所有表便利完畢,返回nil

2、k對應的值,當k==nil的時候返回表中的第乙個值

因此我們可以不使用pairs而直接呼叫next,一樣可以實現遍歷效果

for k, v in next,  do

print(k, v)

end

歸納:

1、lua中,for迴圈分為數值型和泛型兩種。

2、泛型for的實現是利用迭代器,而迭代器的實現是利用閉包

3、迭代器分為有狀態的和無狀態的,且只有在for迴圈中才有無狀態迭代器。

lua for循壞和迭代器

普通for迴圈 for var exp1,exp2,exp3 do 執行體 endvar 從 exp1 變化到 exp2,每次變化以 exp3 為步長遞增 var,並執行一次 執行體 exp3 是可選的,如果不指定,預設為1。函式for迴圈 function f x print function r...

Lua 迭代器和閉包

內容來自 lua程式設計 第四版 18.1節 迭代器和閉包。迭代器 iterator 是一種可以讓我們遍歷乙個集合中所有元素的 結構。在 lua 語言中,通常使用函式表示迭代器 每一次呼叫函式時,函式會返回集合中的 下乙個 元素。乙個典型的例子就是io.read,每次呼叫該函式時它都會返回標準輸入中...

閉包與迭代器

1.python內建函式 def compare args return max args min args a,b compare 1,2,3,4,5,6 print max min format a,b 2.若定義的函式引數為可變型別的變數,若果呼叫改變了此變數,其他可以看到此位置的變數也跟隨改...