API Basic ForEach it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
For Each / Next
ClassicUO • Basic
For Each visita gli elementi di un array o di una raccolta nativa enumerabile senza indice numerico. È un’istruzione nel corpo di una procedura o funzione, non una chiamata API.
Sintassi esatta
For Each item [AS type] In collection
statements
Next [item]
Parametri
item— item: variabile di iterazione. Riutilizza una variabile locale, un parametro o un campo accessibile; altrimenti crea una variabile locale, anche con Option Explicit On. Non può assegnare a una costante.type— type: AS type facoltativo, per esempio Integer. Dichiara un iteratore locale e converte ogni elemento. Senza AS una variabile esistente conserva il proprio tipo.collection— collection: espressione valutata una volta. Sono ammessi array e oggetti nativi enumerabili, non scalari. Gli array annidati forniscono righe; un ciclo interno fornisce celle.statements / NEXT item— statements / NEXT item: corpo e chiusura. Il nome dopo NEXT è facoltativo ma deve corrispondere all’iteratore. NEXT occupa una riga separata.
Restituisce
For Each e Next non restituiscono valori. item riceve il valore dell’elemento, non automaticamente indice, ID o quantità nella pila. RETURN nel corpo termina l’intera funzione. Gli esempi restituiscono Integer 12, 105 e 10.
Comportamento
- La preparazione associa FOR EACH a NEXT prima degli inizializzatori; un abbinamento errato produce SC020. Il motore conserva riferimento e cursore indipendente. Assegnare item non sposta il cursore.
- Gli array vengono letti per indice crescente. Un array vuoto salta il corpo e preserva una variabile esistente senza AS. Elementi non inizializzati e conversioni AS errate producono errori intercettabili.
- Assegnare item non sostituisce l’elemento. Array e oggetti annidati sono riferimenti: modificare una cella di row modifica la riga. Riassegnare collection non cambia il percorso attivo; modifiche ai prossimi elementi dello stesso array sono visibili alla lettura.
- Continue For prosegue il For o For Each più vicino; Exit For lo termina. Errori, RETURN e annullamento rilasciano gli enumeratori nativi. Alcune raccolte vietano modifiche durante l’iterazione; non viene creata una copia automatica.
- L’iteratore rimane visibile nella procedura dopo il ciclo con l’ultimo valore assegnato. Ogni esecuzione ha un cursore indipendente. IDE, completamento, modelli, navigazione, pausa e arresto sono supportati.
Esempi
1. Somma senza indice
# values[2] contiene tre valori: 2, 4, 6. SumItems riceve l’array; item assume ogni valore. total passa da 0 a 12 e RETURN invia Integer 12 a Main. NEXT item chiude il ciclo.
Option Explicit On
Function SumItems(values)
Var total = 0
For Each item In values
total += item
Next item
Return total
End Function
Sub Main()
Dim values[2]
values[0] = 2
values[1] = 4
values[2] = 6
Return SumItems(values)
End Sub
Spiegazione dei parametri e dell’esecuzione:
values[2] contiene tre valori: 2, 4, 6. SumItems riceve l’array; item assume ogni valore. total passa da 0 a 12 e RETURN invia Integer 12 a Main. NEXT item chiude il ciclo.
2. Una valutazione e conversioni
# SelectItems riceve calls ByRef, lo porta a 1 e restituisce ["2", "3"]. AS Integer converte le stringhe in 2 e 3, total=5. item=100 non cambia sorgente o ordine. Main restituisce calls*100+total, Integer 105.
Option Explicit On
Function SelectItems(ByRef calls)
calls += 1
Dim values[1]
values[0] = "2"
values[1] = "3"
Return values
End Function
Sub Main()
Var calls = 0
Var total = 0
For Each item As Integer In SelectItems(calls)
total += item
item = 100
Next
Return calls * 100 + total
End Sub
Spiegazione dei parametri e dell’esecuzione:
SelectItems riceve calls ByRef, lo porta a 1 e restituisce ["2", "3"]. AS Integer converte le stringhe in 2 e 3, total=5. item=100 non cambia sorgente o ordine. Main restituisce calls*100+total, Integer 105.
3. Array annidati
# rows[1][1] contiene due righe di due celle. row riceve il riferimento alla riga; cell riceve 1, 2, 3, 4. Ogni NEXT chiude il proprio ciclo. SumGrid e Main restituiscono Integer 10, senza ricavare automaticamente ID o quantità.
Option Explicit On
Function SumGrid(rows)
Var total = 0
For Each row In rows
For Each cell In row
total += cell
Next cell
Next row
Return total
End Function
Sub Main()
Dim rows[1][1]
rows[0][0] = 1
rows[0][1] = 2
rows[1][0] = 3
rows[1][1] = 4
Return SumGrid(rows)
End Sub
Spiegazione dei parametri e dell’esecuzione:
rows[1][1] contiene due righe di due celle. row riceve il riferimento alla riga; cell riceve 1, 2, 3, 4. Ogni NEXT chiude il proprio ciclo. SumGrid e Main restituiscono Integer 10, senza ricavare automaticamente ID o quantità.