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().
>> 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. => nilCome 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 => 10il
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.
>> e + 'miao' NoMethodError: undefined method `+' for #<Enumerable::Enumerator:0x27c4a70> from (irb):17