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

IteratoriEsterni

cos’eCos’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’URL:http://c2.com/cgi/wiki?IteratorPattern?Iterator Pattern.

L’iterator pattern e’ un meccanismo semplice, in sostanza un oggetto deve mettere a disposizione due metodi (1)

  1. uno che permetta di accedere al prossimo elemento, tipicamente chiamto next() (2)
  2. ed uno che permetta di testare l’esistenza di un elemento successivo,

In ruby, e’ possibile ovviamente implementare questo meccanismo , URL:http://rubycolor.org/dp/Iterator.en.html?[[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>
 irb(main):001:0> require 'generator'
'generator'
 => true
irb(main):002:0>
 irb(main):002:0> a=[1,3,5,7,9]a=[1,3,5,7,9] # un Array, un oggetto Enumerable

 => [1,[1, 3,3, 5,5, 7,7, 9]
irb(main):003:0>9]
 irb(main):003:0> g=Generator.newg=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
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 URL:http://www.ruby-doc.org/stdlib/libdoc/generator/rdoc/index.html?qui o se avete una versione recente di ruby, direttamente nella sua directory della documentazione.

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