Lua知識點三 迭代器與泛型for

2021-08-01 15:11:49 字數 1042 閱讀 7062

迭代器是一種支援指標型別的結構,它可以遍歷集合的每乙個元素。

迭代器需要保留上一次成功呼叫的狀態和下一次成功呼叫的狀態,也就是他知道來自於**和將要前往**。閉包提供的機制可以很容易實現這個任務。記住:閉包是乙個內部函式,它可以訪問乙個或者多個外部函式的外部區域性變數。每次閉包的成功呼叫後這些外部區域性變數都儲存他們的值(狀態)。當然如果要建立乙個閉包必須要建立其外部區域性變數。所以乙個典型的閉包的結構包含兩個函式:乙個是閉包自己;另乙個是工廠(建立閉包的函式)。

泛型for為迭代迴圈處理所有的薄記(bookkeeping):首先呼叫迭代工廠;內部保留迭代函式,因此我們不需要iter變數;然後在每乙個新的迭代處呼叫迭代器函式;當迭代器返回nil時迴圈結束(後面我們將看到泛型for能勝任更多的任務)。

迭代器有乙個缺點:每次呼叫都需要建立乙個閉包,大多數情況下這種做法都沒什麼問題,例如在allwords迭代器中建立乙個閉包的代價比起讀整個檔案來說微不足道,然而在有些情況下建立閉包的代價是不能忍受的。

泛型for的執行過程:

首先,初始化,計算in後面表示式的值,表示式應該返回泛型for需要的三個值:迭代函式、狀態常量、控制變數;與多值賦值一樣,如果表示式返回的結果個數不足三個會自動用nil補足,多出部分會被忽略。

第二,將狀態常量和控制變數作為引數呼叫迭代函式(注意:對於for結構來說,狀態常量沒有用處,僅僅在初始化時獲取他的值並傳遞給迭代函式)。

第三,將迭代函式返回的值賦給變數列表。

第四,如果返回的第乙個值為nil迴圈結束,否則執行迴圈體。

第五,回到第二步再次呼叫迭代函式。

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

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

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

Java 泛型知識點

1 在你建立引數化型別的乙個例項時,編譯器會為你負責轉型操作,並且保證型別的正確性。泛型的主要目的之一就是用來指定容器要持有什麼型別的物件,而且由編譯器來保證型別的正確性。示例 public class holder class orange extends fruit fruit 1 new jo...

C 知識點(6)泛型

為什麼需要泛型 編寫程式的時候容易遇到兩個模組功能相近但是引數型別不同,所以分別寫多個方法處理每種資料型別,不能重用同樣功能的 用根類object來解決存在的缺陷 a 會出現裝箱和拆箱的操作,將會在託管堆上分配和 大量的變數,如果數量龐大,效能會損失嚴重。b 雖然處理引用型別,沒有裝箱和拆箱的操作,...

Lua學習(七) 迭代器和泛型for

array for key,value in ipairs array doprint key,value end 上面的示例使用由lua中提供的預設ipairs迭代函式。function square iteratormaxcount,currentnumber if currentnumbere...