Lua 基礎之迭代器

2022-09-17 20:12:11 字數 2068 閱讀 8903

lua 陣列索引預設從1開始。可以指定0或者負數開始

例子一:

local table = 

for k, v in pairs( table ) do

print(k, v) --> 輸出所有

end

for k, v in ipairs( table ) do

print(k , v) --> 輸出前兩個

end

例子二:

local table = 

for k, v in pairs( table ) do

print(k, v) --> 輸出所有

end

for k, v in ipairs( table ) do

print(k , v) --> 輸出前三個,第乙個 key 不是整數

end

無狀態的迭代器是指不保留任何狀態的迭代器,因此在迴圈中我們可以利用無狀態迭代器避免建立閉包花費額外的代價。

每一次迭代,迭代函式都是用兩個變數(狀態常量和控制變數)的值作為引數被呼叫,乙個無狀態的迭代器只利用這兩個值可以獲取下乙個元素。

這種無狀態迭代器的典型的簡單的例子是 ipairs,它遍歷陣列的每乙個元素。

function square(iteratormaxcount,currentnumber)

if currentnumber < iteratormaxcount

then

currentnumber = currentnumber + 1

return currentnumber, currentnumber*currentnumber

endend-- 迭代函式 狀態常量 控制變數初值

for i,n in square, 3, 0

do print(i,n)

end--[[

1 1

2 4

3 9

]]

手動實現ipairs

function iter (a, i)

i = i + 1

local v = a[i]

if v then

return i, v

endendfunction myipairs (a)

return iter, a, 0

endlocal table =

for i,n in ipairs(table) do

print(i, n)

end--[[

1 1

2 2

3 3

4 4

]]

迭代器需要儲存多個狀態資訊而不是簡單的狀態常量和控制變數,最簡單的方法是使用閉包,還有一種方法就是將所有的狀態資訊封裝到 table 內,將 table 作為迭代器的狀態常量,因為這種情況下可以將所有的資訊存放在 table 內,所以迭代函式通常不需要第二個引數。

array = 

function elementiterator (collection)

local index = 0

local count = #collection

-- 閉包函式

return function ()

index = index + 1

if index <= count

then

-- 返回迭代器的當前元素

return collection[index]

endend

endfor element in elementiterator(array)

do print(element)

end

Lua基礎 迭代器

官方的文件說 迭代器 iterator 是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址 在lua中迭代器是一種支援指標型別的結構,它可以遍歷集合的每乙個元素。迭代器的種類主要有 泛型for迭代器 無狀態的迭代器 多狀態的迭代器 下面看幾個例子 ipa...

lua迭代器原理

當lua呼叫for迴圈中的ipairs a 時,它會獲得三個值 迭代器函式iter 恆定狀態a和控制變數的處置0。然後lua呼叫iter a,0 得到1,a 1 在第二次迭代中,繼續呼叫iter a,1 得到2,a 2 依次類推,直到得到的第乙個nil元素為止。pairs與ipairs類似,也是用於...

Lua 迭代器初學

和c 類似,lua也有迭代器,如汎型for。泛型for需要三個值 迭代函式 狀態常量 控制變數 乙個典型的泛型for如下 for k,v in pairs t do print k,v end 泛型for的執行過程 首先,初始化,計算 in 後面表示式的值,表示式應該返回泛型for需要的三個值 迭代...