国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 23:04:40
字體:
來源:轉載
供稿:網友

任何一種結構,只要允許你遍歷集合中所有元素的都可稱之為迭代器。lua中常常使用函數來描述迭代器,每次調用該函數都返回集合的下一個元素。每一個迭代器都需要保存一些狀態來知道當前處于什么位置和如何進行下一次迭代。對于這樣的任務,閉包提供了很好的機制來完成。一個典型的閉包結構包含兩個函數:一個是閉包自身,一個是創建閉包的工廠。

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

復制代碼 代碼如下:

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簿記所有迭代循環,首先調用迭代工廠,并內部保存迭代函數。每次迭代時調用新的迭代函數。但迭代器返回nil循環結束。

 

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

泛型for的語法:

復制代碼 代碼如下:

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

 

執行過程:

1.初始化迭代函數,狀態常量,控制變量,不足補nil,多出忽略。
2.狀態常量,控制變量作為參數調用迭代函數。
3.將迭代函數返回的值付給變量列表。
4.如果返回的第一個值為nil,則循環結束,否則執行循環體。
5.回到第2步。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 治县。| 叶城县| 安龙县| 定南县| 报价| 手机| 民勤县| 河曲县| 灵石县| 尼勒克县| 山阳县| 上栗县| 运城市| 高密市| 宁强县| 龙岩市| 孝昌县| 马公市| 巴林左旗| 钟山县| 剑川县| 塔城市| 漳州市| 潜江市| 保定市| 平顺县| 都昌县| 安远县| 宣恩县| 鹤山市| 红原县| 荆门市| 南开区| 黄山市| 长岛县| 宜川县| 连云港市| 图们市| 伽师县| 忻州市| 蛟河市|