--迭代器
--一種可以遍歷乙個集合中所有元素的**結構
--函式表述迭代器 每一次呼叫 函式就會返回集合的下乙個元素
--所有迭代器都需要在連續呼叫之間儲存一些狀態 知道當前所處位置以及如何從當前位置到下一步位置
--自定義迭代器 閉包為儲存狀態提供了一種良好的機制
--閉包就是乙個可以訪問其自身環境中乙個或者多個區域性變數的函式
--這些變數連續呼叫過程中的值並將其儲存在閉包中,從而使得閉包能夠記住迭代所處的位置
--建立乙個新的閉包 必須建立非區域性變數 因此乙個閉包結構涉及兩個函式 閉包本身和乙個用於建立該閉包及其封裝變數的工廠
--value為工廠 呼叫工廠就會產生乙個閉包 閉包狀態儲存在i
function values(t)
local i=0
return function() i = i+1; return t[i] end
endlocal t =
local iter = values(t)
while true do
local element = iter()
if element== nil then
break
endprint(element)
end--泛型for
--上述迭代器每次遍歷都會建立乙個閉包
--for在迴圈過程中在內部儲存了迭代函式 泛型for儲存三個值 乙個迭代函式 乙個不可變函式 乙個控制變數
--for第一件事是對in 後面的表示式求值 這些表示式返回三個值供for儲存 在簡單迭代器中 工廠只會返回迭代函式
--之後for使用不可變狀態和控制變數作為引數來呼叫迭代函式
--for**結構來看 不可變狀態沒有意義 for只是把初始化步驟得到的狀態值傳遞給所有迭代函式
--然後 for將迭代函式的返回值賦給變數列表中宣告的變數 如果第乙個返回值為nil 迴圈終止 否則繼續呼叫迭代函式
for var_1,...vra_n in explist do block end
do local _f,_s,_var = explist
while true do
local var_1,...,vra_n = _f(_s,_var)
_var = var_1
if _var==nil then break end
block
endend--無狀態迭代器
--自身不儲存任何狀態迭代器 避免新閉包建立的開銷
--for 迴圈會以不可變狀態和控制變數為引數呼叫迭代函式 乙個無狀態迭代器只根據這兩個值
--為迭代生成下乙個元素 ipairs
local a=
for k,v in ipairs(a) do
print(k,v)
endlocal function iter(t,i)
i = i+1
local v = t[i]
if v then
return i,v
endendfunction ipairs(t)
return iter,t,0
end--呼叫for迴圈中的ipairs(t)時候 ipairs(t)會返回三個值 迭代函式iter 不可變狀態表t 控制變數的初始值0
--然後lua呼叫iter(t,0)得到1,t[1] 依次類推直至得到第乙個為nil的元素
--函式pairs與ipairs類似 用於遍歷表的元素 不同的是 函式pairs的迭代函式是lua語言的乙個基本函式 next
function pairs(t)
return next,t,nil
end--呼叫next(t,k) k是隨機的乙個鍵 該函式會返回表中的下乙個鍵以及對應的值作為第二個返回值
--呼叫next(t,nil)時候 返回表中的第乙個鍵值對 當所有元素被遍歷完 next返回nil
--迭代器真正含義
--上面說到的迭代器並沒有真正的迭代 真正的迭代是for迴圈完成的 迭代器只是為每次的迭代提供連續的值
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需要的三個值 迭代...
Lua基礎 迭代器
官方的文件說 迭代器 iterator 是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址 在lua中迭代器是一種支援指標型別的結構,它可以遍歷集合的每乙個元素。迭代器的種類主要有 泛型for迭代器 無狀態的迭代器 多狀態的迭代器 下面看幾個例子 ipa...