- Lua 教程
- Lua - 首頁
- Lua 基礎
- Lua - 概述
- Lua - 環境
- Lua - 基本語法
- Lua - 註釋
- Lua - 列印 Hello World
- Lua - 變數
- Lua - 資料型別
- Lua - 運算子
- Lua - 迴圈
- Lua - 決策
- Lua - 函式
- Lua - 日期和時間
- Lua 陣列
- Lua - 陣列
- Lua - 多維陣列
- Lua - 陣列長度
- Lua - 遍歷陣列
- Lua 迭代器
- Lua - 迭代器
- Lua 列表
- Lua - 在列表中搜索
- Lua 模組
- Lua - 模組
- Lua - 名稱空間
- Lua 元表
- Lua - 元表
- Lua 協程
- Lua - 協程
- Lua 檔案處理
- Lua - 檔案 I/O
- Lua 庫
- Lua - 標準庫
- Lua - 數學庫
- Lua - 作業系統功能
- Lua 有用資源
- Lua - 快速指南
- Lua - 有用資源
- Lua - 討論
Lua - 迭代器
迭代器是一種構造,它使您能夠遍歷所謂的集合或容器中的元素。在 Lua 中,這些集合通常指的是表,表用於建立各種資料結構,如陣列。
泛型 For 迭代器
泛型for迭代器提供集合中每個元素的鍵值對。下面給出一個簡單的例子。
main.lua
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
輸出
當我們執行以上程式碼時,我們將得到以下輸出:
1 Lua 2 Tutorial
以上示例使用 Lua 提供的預設ipairs迭代器函式。
在 Lua 中,我們使用函式來表示迭代器。根據這些迭代器函式中的狀態維護,我們主要有兩種型別:
- 無狀態迭代器
- 有狀態迭代器
無狀態迭代器
顧名思義,我們可以理解這種型別的迭代器函式不保留任何狀態。
現在讓我們看看一個建立我們自己的迭代器的例子,它使用一個簡單的函式列印n個數字的平方。
main.lua
function square(iteratorMaxCount,currentNumber)
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
輸出
當我們執行以上程式時,我們將得到以下輸出。
1 1 2 4 3 9
以上程式碼可以稍作修改,以模擬迭代器ipairs函式的工作方式。如下所示。
main.lua
function square(iteratorMaxCount,currentNumber)
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
輸出
當我們執行以上程式時,我們將得到以下輸出。
1 1 2 4 3 9
有狀態迭代器
前面使用函式進行迭代的示例不保留狀態。每次呼叫函式時,它都會根據傳送到函式的第二個變數返回集合的下一個元素。為了儲存當前元素的狀態,使用了閉包。閉包跨函式呼叫保留變數值。要建立一個新的閉包,我們建立兩個函式,包括閉包本身和工廠,即建立閉包的函式。
現在讓我們看看一個建立我們自己的迭代器的例子,在這個例子中我們將使用閉包。
main.lua
array = {"Lua", "Tutorial"}
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
輸出
當我們執行以上程式時,我們將得到以下輸出。
Lua Tutorial
在上面的例子中,我們可以看到elementIterator在內部還有另一個方法,它使用區域性外部變數index和count透過每次呼叫函式時遞增index來返回集合中的每個元素。
我們可以像上面一樣使用閉包建立我們自己的函式迭代器,並且它可以為每次遍歷集合時返回多個元素。
廣告