今天開始迭代器的學習,看了《Programming in Lua 》這一章,看了2遍才稍微弄懂了一點兒,在這裏與大家一起分享。
一、迭代器就是遍歷集合的元素
這是一個簡單的迭代器程序,用途是遍歷t這個table中的值
function value(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
調用迭代器:
t = {10,20,30}
local iter = value(t) -- 創建迭代器
while true do
-- 儘可能的使用局部變量,調用迭代器
<span style="white-space:pre"> </span>local e = iter()
<span style="white-space:pre"> </span>if e then
<span style="white-space:pre"> </span>print(e)
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>end
end
創建一個closure(迭代器)後,保存在變量iter中,此後循環調用時就不會產生新的closure。二、泛型for語句
首先,for對in後面的表達式求值,表達式返回迭代器函數、恆定狀態和控制變量的初值給for保存。然後,for會以恆定狀態和控制變量來調用迭代器函數。
最後,for執行循環體,直到迭代器函數的第一個返回值爲nil。循環結束。
又是上面的例子,這次是用泛型for調用迭代器:
t = {10,20,30} --數組
for v in value(t) do
print(v)
end
相當於:
do
--1. for對in後面的表達式求值,返回值:_f:迭代函數 _s:恆定狀態 _var:控制變量的初始值
local _f,_s,_var = value(t)
--2. for進入循環狀態
while true do
local v = _f(_s,_var) --調用迭代函數
_var = v
if _var == nil then
break --3. 結束循環
end
print(v)
end
end
三、迭代器接受函數作爲參數,在其內部的循環中調用函數
這段代碼表示在遍歷當前文件中所有的單詞:
function allwords(f)
for line in io.lines() do
-- io.lines 迭代函數:從文件中讀取一行
for word in string.gmatch(line,"%w+") do
--string.gmatch迭代函數:從line中查找單詞
f(word)
end
end
end
allwords(print)