Lua 學習筆記(六) —— 迭代器和泛型for

今天開始迭代器的學習,看了《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)

發佈了49 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章