日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lua 迭代器

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lua 迭代器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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


泛型 for 迭代器

泛型 for 在自己內部保存迭代函數,實際上它保存三個值:迭代函數、狀態常量、控制變量。

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

for k, v in pairs(t) doprint(k, v) end

上面代碼中,k, v為變量列表;pairs(t)為表達式列表。

查看以下實例:

array = {"Lua", "Tutorial"}for key,value in ipairs(array) doprint(key, value) end

以上代碼執行輸出結果為:

1 Lua 2 Tutorial

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

下面我們看看泛型 for 的執行過程:

  • 首先,初始化,計算in后面表達式的值,表達式應該返回泛型 for 需要的三個值:迭代函數、狀態常量、控制變量;與多值賦值一樣,如果表達式返回的結果個數不足三個會自動用nil補足,多出部分會被忽略。
  • 第二,將狀態常量和控制變量作為參數調用迭代函數(注意:對于for結構來說,狀態常量沒有用處,僅僅在初始化時獲取他的值并傳遞給迭代函數)。
  • 第三,將迭代函數返回的值賦給變量列表。
  • 第四,如果返回的第一個值為nil循環結束,否則執行循環體。
  • 第五,回到第二步再次調用迭代函數

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

  • 無狀態的迭代器
  • 多狀態的迭代器

無狀態的迭代器

無狀態的迭代器是指不保留任何狀態的迭代器,因此在循環中我們可以利用無狀態迭代器避免創建閉包花費額外的代價。

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

這種無狀態迭代器的典型的簡單的例子是ipairs,它遍歷數組的每一個元素。

以下實例我們使用了一個簡單的函數來實現迭代器,實現 數字 n 的平方:

function square(iteratorMaxCount,currentNumber)if currentNumber<iteratorMaxCountthencurrentNumber = currentNumber+1return currentNumber, currentNumber*currentNumberend endfor i,n in square,3,0 doprint(i,n) end

以上實例輸出結果為:

1????1 2????4 3????9

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

function iter (a, i)i = i + 1local v = a[i]if v thenreturn i, vend endfunction ipairs (a)return iter, a, 0 end

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


多狀態的迭代器

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

?

以下實例我們創建了自己的迭代器:

array = {"Lua", "Tutorial"}function elementIterator (collection)local index = 0local count = #collection-- 閉包函數return function ()index = index + 1if index <= countthen-- 返回迭代器的當前元素return collection[index]endend endfor element in elementIterator(array) doprint(element) end

以上實例輸出結果為:

Lua Tutorial

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

總結

以上是生活随笔為你收集整理的Lua 迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。