Iteratore: differenze tra le versioni

Jump to navigation Jump to search
126 byte aggiunti ,  1 anno fa
m
tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (7), </source> → </syntaxhighlight> (7)
m (Bot: passaggio degli url da HTTP a HTTPS)
m (tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (7), </source> → </syntaxhighlight> (7))
Alcuni linguaggi orientati agli oggetti, come Perl e Python, forniscono un modo intrinseco di iterare sugli elementi di un oggetto contenitore senza l'introduzione di un oggetto iteratore esplicito.
Ciò si manifesta spesso in qualche tipo di operatore "for-each", come nei seguenti esempi:
<sourcesyntaxhighlight lang=perl>
# Perl, iterazione implicita
foreach $val (@list) {
print "$val\n";
}</sourcesyntaxhighlight>
<sourcesyntaxhighlight lang=python>
# Python, iterazione implicita
for Value in List:
print Value
</syntaxhighlight>
</source>
Anche il linguaggio C++ ha un template di funzione std::for_each() che permette una simile iterazione implicita, ma richiede ancora oggetti iteratori espliciti come input iniziale.
 
Il seguente esempio mostra un tipico uso di un iteratore.
 
<sourcesyntaxhighlight lang=cpp>
ContainerType C; // Qualunque tipo di contenitore standard, come std::list<qualchetipo>
ContainerType::iterator A = C.begin();
++A;
}
</syntaxhighlight>
</source>
Ci sono molte varietà di iteratori, ognuno con un comportamento leggermente diverso, tra i quali: iteratori in avanti,
all'indietro, e bidirezionali; iteratori ad accesso diretto; iteratori di input e di output; e iteratori "const" (che proteggono
Introdotto nella versione 1.2 il supporto per gli iteratori è realizzato attraverso la classe parametrica ListIterator del pacchetto Java.util. Ogni classe che implementi l'interfaccia Iterable possiede infatti un set di metodi di supporto: un metodo listIterator() che crea l'iteratore, un metodo next() che lo fa avanzare ed un metodo hasNext() che verifica l'esistenza del nodo successivo ed opzionalmente un metodo remove().
 
<sourcesyntaxhighlight lang=java>
//crea una lista concatenata che sarà visitata grazie all'iteratore
LinkedList<String> lista = new LinkedList<String>();
System.out.println(temp);
}
</syntaxhighlight>
</source>
 
Per i tipi di collezioni che lo supportano, il metodo remove() dell'iteratore può essere usato per togliere dal contenitore l'elemento visitato per ultimo.
Tutti i tipi di sequenza incorporati in Python supportano l'iterazione, così come molte classi che fanno parte della libreria standard.
Il seguente esempio mostra una tipica iterazione implicita su un sequenza:
<sourcesyntaxhighlight lang=python>
for value in sequence:
print value
</syntaxhighlight>
</source>
Tuttavia, gli iteratori possono essere usati e definiti esplicitamente. Per ogni tipo o classe di sequenza iterabile, la funzione incorporata iter() viene usata per creare un oggetto iteratore. Tale oggetto iteratore fornisce un metodo next() che rende l'elemento successivo del contenitore. Quando non rimangono più elementi, verrà sollevata un'eccezione di tipo StopIteration. Il seguente esempio mostra un'iterazione equivalente su una sequenza usando iteratori espliciti:
<sourcesyntaxhighlight lang=python>
it = iter(sequence)
try:
except StopIteration:
pass
</syntaxhighlight>
</source>
Qualunque classe definita dall'utente può supportare l'iterazione standard (sia implicita che esplicita) definendo un metodo <code>__iter__()</code> che crea un oggetto iteratore (che dovrà definire il metodo <code>next()</code>).
 
Anche Python supporta i generatori, che sono una categoria speciale di iteratori su una collezione non realizzata. Un generatore è una funzione "congelata". Dopo che ogni valore è stato emesso (con l'istruzione "yield"), lo stato della funzione viene congelato. Quando la funzione viene invocata nuovamente, l'esecuzione riprende dal punto in cui l'istruzione 'yield' l'aveva abbandonata, con tutte le variabili della funzione nello stato in cui erano. Ecco un esempio di un generatore che rende ogni numero della successione di Fibonacci:
<sourcesyntaxhighlight lang=python>
def fibo_gen():
x = 0
yield x
x, y = y, x+y
</syntaxhighlight>
</source>
 
== Voci correlate ==
611 667

contributi

Menu di navigazione