Iteratori Personalizzati

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


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=" 
 Quant'è bella giovinezza
 che si fugge tuttavia!
 Chi vuol esser lieto, sia:
 di doman non c'è certezza.
 " 
 => "\nQuant'è bella giovinezza\nche si fugge tuttavia!\nChi vuol esser lieto,
  sia:\ndi doman non c'è certezza.\n" 
 >> puts stringa.sort #lavora con each, quindi con le linee

 Chi vuol esser lieto, sia:
 Quant'è bella giovinezza
 che si fugge tuttavia!
 di doman non c certezza.
 => 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'
 => true
 >> e=Enumerable::Enumerator.new( stringa, :each_byte
 => #<Enumerable::Enumerator:0x27c4a70>
 >> e.min
 => 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: undefined method `+' for #<Enumerable::Enumerator:0x27c4a70>
         from (irb):17

Updated on November 26, 2005 13:23 by Ruby Fan (151.37.150.7)