最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年04月23日 10:35:47   投稿:junjie  
這篇文章主要介紹了Lua中的迭代器和泛型for介紹,任何一種結(jié)構(gòu),只要允許你遍歷集合中所有元素的都可稱之為迭代器,本文就講解了Lua中迭代器的相關(guān)知識和代碼實例,并講解了泛型for的語法,需要的朋友可以參考下

任何一種結(jié)構(gòu),只要允許你遍歷集合中所有元素的都可稱之為迭代器。lua中常常使用函數(shù)來描述迭代器,每次調(diào)用該函數(shù)都返回集合的下一個元素。每一個迭代器都需要保存一些狀態(tài)來知道當前處于什么位置和如何進行下一次迭代。對于這樣的任務(wù),閉包提供了很好的機制來完成。一個典型的閉包結(jié)構(gòu)包含兩個函數(shù):一個是閉包自身,一個是創(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ù)。每次迭代時調(diào)用新的迭代函數(shù)。但迭代器返回nil循環(huán)結(jié)束。

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

泛型for的語法:

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

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

執(zhí)行過程:

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

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

相關(guān)文章

  • Lua教程(十): 全局變量和非全局的環(huán)境

    Lua教程(十): 全局變量和非全局的環(huán)境

    這篇文章主要介紹了Lua教程(十): 全局變量和非全局的環(huán)境,本文講解了老的全局變量環(huán)境和Lua5中新的非全局環(huán)境相關(guān)知識,需要的朋友可以參考下
    2015-04-04
  • Lua中使用元表(metatable)執(zhí)行算術(shù)類元方法實例

    Lua中使用元表(metatable)執(zhí)行算術(shù)類元方法實例

    這篇文章主要介紹了Lua中使用元表(metatable)執(zhí)行算術(shù)類元方法實例,本文給出了加法、減法、乘法、除法、相反數(shù)、取模等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 最新評論

    乳源| 杨浦区| 凤冈县| 灵台县| 丹江口市| 景东| 东阳市| 江都市| 高邮市| 桐乡市| 汉川市| 普宁市| 麻江县| 民乐县| 遂宁市| 双牌县| 瑞昌市| 马鞍山市| 武宣县| 修水县| 宝应县| 本溪市| 吉木萨尔县| 南靖县| 恩平市| 凌海市| 东乌| 观塘区| 鄯善县| 织金县| 桐乡市| 崇文区| 江津市| 鱼台县| 无锡市| 安顺市| 南安市| 镇宁| 财经| 石阡县| 扎赉特旗|