麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > 綜合 > 正文

Lua中的迭代器和泛型for介紹

2024-07-21 23:04:40
字體:
供稿:網(wǎng)友

任何一種結(jié)構(gòu),只要允許你遍歷集合中所有元素的都可稱之為迭代器。lua中常常使用函數(shù)來描述迭代器,每次調(diào)用該函數(shù)都返回集合的下一個(gè)元素。每一個(gè)迭代器都需要保存一些狀態(tài)來知道當(dāng)前處于什么位置和如何進(jìn)行下一次迭代。對(duì)于這樣的任務(wù),閉包提供了很好的機(jī)制來完成。一個(gè)典型的閉包結(jié)構(gòu)包含兩個(gè)函數(shù):一個(gè)是閉包自身,一個(gè)是創(chuàng)建閉包的工廠。

例如,我們可以寫過簡單的list迭代器,讓他僅僅返回值。

復(fù)制代碼 代碼如下:

function values( t )
     local i = 0;
     return function() i = i + 1;return t[i] end
end

 

tb = {33, 44, 55}

for v in values(tb) do
     print(v)
end


泛型for簿記所有迭代循環(huán),首先調(diào)用迭代工廠,并內(nèi)部保存迭代函數(shù)。每次迭代時(shí)調(diào)用新的迭代函數(shù)。但迭代器返回nil循環(huán)結(jié)束。

 

上面的迭代器有個(gè)瑕疵:需要?jiǎng)?chuàng)建一個(gè)閉包。創(chuàng)建閉包是需要代價(jià)的,只是大部分情況下都沒問題,然而有些情況卻是不能容忍這個(gè)代價(jià)的。這時(shí)的解決方法是使用泛型for。泛型for本身保存迭代狀態(tài),包括迭代函數(shù),狀態(tài)常量,控制變量,因此不必付出閉包的代價(jià),稱這種迭代器為無狀態(tài)迭代器。

泛型for的語法:

復(fù)制代碼 代碼如下:

for <var-list> in <exp-list> do
     <body>
end

 

執(zhí)行過程:

1.初始化迭代函數(shù),狀態(tài)常量,控制變量,不足補(bǔ)nil,多出忽略。
2.狀態(tài)常量,控制變量作為參數(shù)調(diào)用迭代函數(shù)。
3.將迭代函數(shù)返回的值付給變量列表。
4.如果返回的第一個(gè)值為nil,則循環(huán)結(jié)束,否則執(zhí)行循環(huán)體。
5.回到第2步。

如果遇到需要保存多個(gè)狀態(tài),還有種方法是將所有狀態(tài)封裝到表中。實(shí)際上,我們不推薦這么寫。因?yàn)閯?chuàng)建閉包的代價(jià)比創(chuàng)建表的要小,而且lua處理閉包的速度更快些。還有更強(qiáng)大更復(fù)雜的方式是使用協(xié)同來創(chuàng)建迭代器。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产一级毛片高清视频完整版 | 精品国产一区二区三区天美传媒 | 国产免费大片视频 | 欧美性videofree精品 | 久草在线高清 | 久久91亚洲精品久久91综合 | 久久亚洲第一 | 久久久久久麻豆 | 天天看逼| 男女无套免费视频 | 亚洲精品免费播放 | 国产乱淫a∨片免费观看 | 国产va在线观看 | 欧美精品成人一区二区三区四区 | 久久久久久99 | 久久人人爽人人爽人人片av高清 | 91精品国产手机 | 免费在线观看国产 | 免费在线国产 | 国产剧情v888av | 天天碰天天操 | 美国黄色毛片女人性生活片 | 毛片免费观看完整版 | 一区二区三区欧美在线观看 | 中文在线观看视频 | 久草在线看片 | 久久免费精品 | 日本高清黄色片 | a网在线| 免费视频www在线观看 | 欧美视频在线一区二区三区 | 亚洲欧美在线视频免费 | 鲁人人人鲁人人鲁精品 | 成人午夜在线播放 | 成人免费av在线播放 | 亚洲综合中文 | wwwxxx国产 | 91一区二区三区久久久久国产乱 | 成年人网站视频免费 | 人人玩人人爽 | 免费三级大片 |