Iteratori Esterni

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


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.

L’iterator pattern e’ un meccanismo semplice, in sostanza un oggetto deve mettere a disposizione due metodi
  1. uno che permetta di accedere al prossimo elemento, tipicamente chiamto next()
  2. 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.

Vediamo un’esempio:
 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.

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