淺析Lua中的迭代器
迭代器是一種結(jié)構(gòu),使能夠遍歷所謂的集合或容器中的元素。在Lua中,這些集合通常是指那些用于創(chuàng)建各種數(shù)據(jù)結(jié)構(gòu),如數(shù)組表。
一般對于迭代器
一個(gè)通用的迭代器提供的鍵值對集合中的每個(gè)元素。下面一個(gè)簡單的實(shí)例。
for key,value in ipairs(array)
do
print(key, value)
end
當(dāng)我們運(yùn)行上面的代碼之后將得到下面的輸出
2 Tutorial
上面的示例使用由Lua中提供的默認(rèn)ipairs迭代函數(shù)。
在Lua中,我們使用函數(shù)來表示迭代器。基于這些迭代器的功能狀態(tài)保持,有兩種主要類型:
- 無狀態(tài)的迭代器
- 迭代器狀態(tài)
無狀態(tài)的迭代器
由名字本身就可以明白,這類型的迭代器功能不保留任何狀態(tài)。
現(xiàn)在讓我們來看看使用打印n個(gè)數(shù)的平方簡單的函數(shù),來創(chuàng)建我們自己的迭代器的例子。
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
當(dāng)我們運(yùn)行上面的程序,會得到下面的輸出。
2 4
3 9
上面的代碼可以稍微進(jìn)行修改,以模仿迭代器的工作方式ipairs函數(shù)。它如下所示。
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
function squares(iteratorMaxCount)
return square,iteratorMaxCount,0
end
for i,n in squares(3)
do
print(i,n)
end
當(dāng)我們運(yùn)行上面的程序,會得到下面的輸出。
2 4
3 9
迭代器狀態(tài)
迭代使用功能不保留狀態(tài),前面的例子。每次調(diào)用該函數(shù)時(shí),它返回一個(gè)基于發(fā)送給函數(shù)的第二變量的集合的下一個(gè)元素。來保存當(dāng)前元素的狀態(tài),封閉物使用。關(guān)閉保留不同職能調(diào)用變量的值。要?jiǎng)?chuàng)建一個(gè)新的閉包,我們創(chuàng)建了兩個(gè)函數(shù),包括封閉自己,一個(gè)工廠,創(chuàng)建封閉的功能。
現(xiàn)在讓我們看看創(chuàng)造我們自己的迭代中,我們將使用閉包的一個(gè)例子。
function elementIterator (collection)
local index = 0
local count = #collection
-- The closure function is returned
return function ()
index = index + 1
if index <= count
then
-- return the current element of the iterator
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
當(dāng)我們運(yùn)行上面的程序,會得到下面的輸出。
Tutorial
在上面的例子中,我們可以看到,元素迭代具有另一種方法里,使用的本地外部變量索引和計(jì)數(shù)由每個(gè)函數(shù)被調(diào)用時(shí)遞增索引,返回每個(gè)集合中的元素。
我們可以創(chuàng)建使用閉包的函數(shù)的迭代器,如上圖所示,它可以返回多個(gè)元素,每一個(gè)我們通過收集循環(huán)時(shí)間。
相關(guān)文章
使用lua實(shí)現(xiàn)php的var_dump()函數(shù)功能
小編比較熟悉php,所以這篇文章主要介紹了使用lua實(shí)現(xiàn)php的var_dump()函數(shù)功能,需要的朋友可以參考下2014-11-11vs2012 error c4996: This function or variable may be unsafe
這篇文章主要介紹了vs2012 error c4996: This function or variable may be unsafe,需要的朋友可以參考下2015-04-04Lua編程示例(二):面向?qū)ο蟆etatable對表進(jìn)行擴(kuò)展
這篇文章主要介紹了Lua編程示例(二):面向?qū)ο?、metatable對表進(jìn)行擴(kuò)展,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法)
這篇文章主要介紹了Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法),本文同時(shí)講解了metatable、元方法等內(nèi)容,需要的朋友可以參考下2014-10-10