Note: Testo rimosso dalla rev 1  e Testo aggiunto nella rev2

IteratoriPersonalizzati

Alcune classi, ad esempio String mettono a disposizione differenti modi per iterare. Nel caso di String abbiamo each_byte() e each_line(). Il metodo each() di String e’ un alias per each_line(). Poiche’ in questa classe e’ stato incluso il modulo Enumerable, possiamo usare tutte le funzioni come max() o map(), ma ovviamente l’iteratore alla base sara’ each_line().

Vediamo un esempio:

 >> stringa=”stringa=" 
 Quant’èQuant'è bella giovinezza
 che si fugge tuttavia!
 Chi vuol esser lieto, sia:
 di doman non c’èc'è certezza.
 " 
 => ”\nQuant’\212"\nQuant'è bella giovinezza\nchegiovinezza\nche si fugge tuttavia!\nChituttavia!\nChi vuol esser lieto,
  sia:\ndisia:\ndi doman non c’\212c'è certezza.\n”certezza.\n" 
 >> puts stringa.sortstringa.sort #lavora con each, quindi con le linee



 Chi vuol esser lieto,lieto, sia:
Quant'èsia:
 Quant'è bella giovinezza

 che si fugge tuttavia!

 di doman non c'èc certezza.certezza.
 => nil
=> nil

Come fare per usare sort() o max(), insomma i metodi di Enumerable usando each_byte() ? La soluzione e’ usare un oggetto Enumerator:

 >> require ‘enumerator’'enumerator'
 => true
 >> e=Enumerable::Enumerator.new(e=Enumerable::Enumerator.new( stringa,stringa, :each_byte
 => ##<Enumerable::Enumerator:0x27c4a70>
 >> e.mine.min
 => 1o

10

il 10 e’ dovuto al fatto che lavoriamo su byte non su caratteri, e sarebbe lo ”\n”.

Come vedete l’uso di Enumerator e’ semplicissimo: per creare uno di questi oggetti basta usare un oggetto Enumerable, ed il simbolo che rappresenta il metodo da usare come iteratore. Una volta creato possiamo usarlo per iterare come ci pare, avendo a disposozione tutti i metodi di Enumerable.

Ricordate che non stiamo piu’ usando una stringa!


 >> e + ‘miao’
	NoMethodError:'miao'
 NoMethodError: undefined method `+’`+' for #
        #<Enumerable::Enumerator:0x27c4a70>
         from (irb):17

Created on November 25, 2005 13:37 by il gruppo (256.256.256.256)