Cos’e un Iteratore?
Si tratta di un meccanismo che ci permette di lavorare in sequenza su tutti gli elementi contenuti in una collezione. In ruby, gli iteratori sono tutti quelli accettano un blocco, come each(), map() eccetera.
In linguaggi sfortunati che non hanno a disposizione funzioni anonime e la keyword yield, questo comportameto viene costruito tramite l’Iterator Pattern.
- uno che permetta di accedere al prossimo elemento, tipicamente chiamto
next() - ed uno che permetta di testare l’esistenza di un elemento successivo,
In ruby, e’ possibile ovviamente implementare questo meccanismo , [[quest ne e’ un esempio,
Ma non solo, e’ molto semplice usare uno degli iteratori interni cioe’ quelli che usano yield trasformandolo in esterno, tramite la libreria generator.
irb(main):001:0> require 'generator' => true irb(main):002:0> a=[1,3,5,7,9] # un Array, un oggetto Enumerable => [1, 3, 5, 7, 9] irb(main):003:0> g=Generator.new a => #<Generator:0x27dcd40 @queue=[1], @cont_endp=nil, @index=0, @block=#<Proc:0x 27db600@C:/Programmi/ruby-1.8/ruby/lib/ruby/1.8/generator.rb:69>, @cont_yield=# Continuation:0x27dca70>, @cont_next=nil> irb(main):004:0> g.current => 1 irb(main):005:0> g.next => 1 irb(main):006:0> g.next => 3 irb(main):007:0> g.next => 5 irb(main):008:0> g.next? => true irb(main):009:0> g.next => 7 irb(main):010:0> g.next? => true irb(main):011:0> g.next => 9 irb(main):012:0> g.next? => false
Un Generator viene creato passandogli un oggetto che implementi il metodo each().
Come potete vedere il suo uso e’ piuttosto ovvio.
Potete vederne la documentazione dettagliata qui o se avete una versione recente di ruby, direttamente nella sua directory della documentazione.