Lua 迭代器

迭代器(iterator)是一種對象计露,它能夠用來遍歷標準模板庫容器中的部分或全部元素夺姑,每個迭代器對象代表容器中的確定的地址

在Lua中迭代器是一種支持指針類型的結構锤躁,它可以遍歷集合的每一個元素涯呻。


泛型 for 迭代器

泛型 for 在自己內部保存迭代函數黍翎,實際上它保存三個值:迭代函數面徽、狀態(tài)常量、控制變量匣掸。

泛型 for 迭代器提供了集合的 key/value 對趟紊,語法格式如下:

上面代碼中,k, v為變量列表碰酝;pair(t)為表達式列表霎匈。

查看以下實例:

以上代碼執(zhí)行輸出結果為:

以上實例中我們使用了 Lua 默認提供的迭代函數 ipairs。

下面我們看看范性for的執(zhí)行過程:

首先送爸,初始化铛嘱,計算in后面表達式的值暖释,表達式應該返回范性for需要的三個值:迭代函數、狀態(tài)常量墨吓、控制變量球匕;與多值賦值一樣,如果表達式返回的結果個數不足三個會自動用nil補足帖烘,多出部分會被忽略亮曹。

第二,將狀態(tài)常量和控制變量作為參數調用迭代函數(注意:對于for結構來說蚓让,狀態(tài)常量沒有用處乾忱,僅僅在初始化時獲取他的值并傳遞給迭代函數)。

第三历极,將迭代函數返回的值賦給變量列表窄瘟。

第四,如果返回的第一個值為nil循環(huán)結束趟卸,否則執(zhí)行循環(huán)體蹄葱。

第五,回到第二步再次調用迭代函數

在Lua中我們常常使用函數來描述迭代器锄列,每次調用該函數就返回集合的下一個元素图云。Lua 的迭代器包含以下兩種類型:

無狀態(tài)的迭代器

多狀態(tài)的迭代器


無狀態(tài)的迭代器

無狀態(tài)的迭代器是指不保留任何狀態(tài)的迭代器,因此在循環(huán)中我們可以利用無狀態(tài)迭代器避免創(chuàng)建閉包花費額外的代價邻邮。

每一次迭代竣况,迭代函數都是用兩個變量(狀態(tài)常量和控制變量)的值作為參數被調用,一個無狀態(tài)的迭代器只利用這兩個值可以獲取下一個元素筒严。

這種無狀態(tài)迭代器的典型的簡單的例子是ipairs丹泉,他遍歷數組的每一個元素。

以下實例我們使用了一個簡以上實例輸出結果為:單的函數來實現迭代器鸭蛙,實現 數字 n 的平方:

以上實例輸出結果為:

迭代的狀態(tài)包括被遍歷的表(循環(huán)過程中不會改變的狀態(tài)常量)和當前的索引下標(控制變量)摹恨,ipairs和迭代函數都很簡單,我們在Lua中可以這樣實現:

當Lua調用ipairs(a)開始循環(huán)時娶视,他獲取三個值:迭代函數iter晒哄、狀態(tài)常量a、控制變量初始值0肪获;然后Lua調用iter(a,0)返回1,a[1](除非a[1]=nil)寝凌;第二次迭代調用iter(a,1)返回2,a[2]……直到第一個nil元素。


多狀態(tài)的迭代器

很多情況下孝赫,迭代器需要保存多個狀態(tài)信息而不是簡單的狀態(tài)常量和控制變量硫兰,最簡單的方法是使用閉包,還有一種方法就是將所有的狀態(tài)信息封裝到table內寒锚,將table作為迭代器的狀態(tài)常量劫映,因為這種情況下可以將所有的信息存放在table內违孝,所以迭代函數通常不需要第二個參數。

以下實例我們創(chuàng)建了自己的迭代器:

以上實例輸出結果為:

以上實例中我們可以看到泳赋,elementIterator 內使用了閉包函數雌桑,實現計算集合大小并輸出各個元素。


內容來自:runoob.com 菜鳥教程

整理:極動云祖今,寧波家電物聯網云平臺

CONTACT US: http://www.iot-jd.com

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末校坑,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子千诬,更是在濱河造成了極大的恐慌耍目,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徐绑,死亡現場離奇詭異邪驮,居然都是意外死亡,警方通過查閱死者的電腦和手機傲茄,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門毅访,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盘榨,你說我怎么就攤上這事喻粹。” “怎么了草巡?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵守呜,是天一觀的道長。 經常有香客問我山憨,道長查乒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任萍歉,我火速辦了婚禮,結果婚禮上档桃,老公的妹妹穿的比我還像新娘枪孩。我一直安慰自己,他們只是感情好藻肄,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布蔑舞。 她就那樣靜靜地躺著,像睡著了一般嘹屯。 火紅的嫁衣襯著肌膚如雪攻询。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天州弟,我揣著相機與錄音钧栖,去河邊找鬼低零。 笑死,一個胖子當著我的面吹牛拯杠,可吹牛的內容都是我干的掏婶。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼潭陪,長吁一口氣:“原來是場噩夢啊……” “哼雄妥!你這毒婦竟也來了?” 一聲冷哼從身側響起依溯,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤老厌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后黎炉,有當地人在樹林里發(fā)現了一具尸體枝秤,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年拜隧,在試婚紗的時候發(fā)現自己被綠了宿百。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪添,死狀恐怖垦页,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情干奢,我是刑警寧澤痊焊,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站忿峻,受9級特大地震影響薄啥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜逛尚,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一垄惧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰寞,春花似錦到逊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至件缸,卻和暖如春铜靶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背他炊。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工争剿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留已艰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓秒梅,卻偏偏與公主長得像旗芬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捆蜀,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容