English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
L'iteratore (iterator) è un oggetto che può essere utilizzato per esplorare parte o tutti gli elementi di una libreria di modelli standard, ogni oggetto di iteratore rappresenta un indirizzo determinato nel contenitore.
In Lua, l'iteratore è una struttura che supporta il tipo di puntatore, può esplorare ogni elemento di un set.
L'iteratore generico for salva la funzione di iterazione internamente, di fatto salva tre valori: la funzione di iterazione, il costante di stato, il variabile di controllo.
L'iteratore generico for fornisce pair/key di un set, il formato della sintassi è il seguente:
for k, v in pairs(t) do print(k, value) end
Nel codice sopra, k, v sono elenchi di variabili; pairs(t) è un elenco di espressioni.
Ecco un esempio:
array = {"Google", "w3codebox"} for key, value in ipairs(array) do print(key, value) end
Il risultato dell'esecuzione del codice è il seguente:
1 Google 2 w3codebox
Nell'esempio sopra abbiamo utilizzato la funzione di iterazione predefinita di Lua ipairs.
Vediamo ora il processo di esecuzione del for generico:
Prima di tutto, l'inizializzazione, calcolare il valore dell'espressione dopo in, l'espressione dovrebbe restituire tre valori necessari per il for generico: funzione di iterazione, costante di stato, variabile di controllo; come nel multi-valore assegnamento, se il numero di risultati restituiti dall'espressione è inferiore a tre, viene automaticamente completato con nil, e la parte in eccesso viene ignorata.
Secondo, chiamare la funzione di iterazione con i parametri costante di stato e variabile di controllo (notare: per la struttura for, la costante di stato non ha senso, viene solo utilizzata per ottenere il suo valore e passarlo alla funzione di iterazione).
Terzo, assegnare i valori restituiti dalla funzione di iterazione a una lista di variabili.
Quarto, se il primo valore restituito è nil, il ciclo termina, altrimenti eseguire il corpo del ciclo.
Quinto, tornare al passo due e chiamare di nuovo la funzione di iterazione
In Lua, spesso utilizziamo le funzioni per descrivere gli iteratori, ogni volta che chiamiamo la funzione, viene restituito l'elemento successivo della raccolta. Gli iteratori di Lua includono i seguenti due tipi:
Iteratore senza stato
迭代器多状态
Un iteratore senza stato è uno che non mantiene alcun stato, quindi possiamo utilizzare un iteratore senza stato nel ciclo per evitare di creare closure e sostenere costi aggiuntivi.
In ogni iterazione, la funzione di iterazione viene chiamata con due variabili (costante di stato e variabile di controllo) come parametri, un iteratore senza stato utilizza questi due valori per ottenere l'elemento successivo.
Un esempio tipico e semplice di questo iteratore senza stato è ipairs, che percorre ogni elemento dell'array.
Nell'esempio seguente abbiamo utilizzato una funzione semplice per implementare l'iteratore, per calcolare il quadrato del numero n:
function square(iteratorMaxCount, currentNumber) if currentNumber < iteratorMaxCount then currentNumber = currentNumber + 1 return currentNumber, currentNumber * currentNumber end end for i, n in square, 3, 0 do print(i, n) end
以上示例输出结果为:
1 1 2 4 3 9
L' stato dell' iterazione include la tabella percorribile (costante di stato che non cambia durante il ciclo) e l' indice di posizione corrente (variabile di controllo), le funzioni ipairs e di iterazione sono molto semplici, possiamo implementarle così nel Lua:
function iter(a, i) i = i + 1 local v = a[i] if v then return i, v end end function 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 = {"Google", "w3codebox"} function elementIterator(collection) local index = 0 local count = #collection -- 闭包函数 return function () index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end for element in elementIterator(array) do print(element) end
以上示例输出结果为:
Google w3codebox
在以上示例中我们可以看到,elementIterator 内使用了闭包函数,实现计算集合大小并输出各个元素。