Creare Enumerable

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


Effettuare un’iterazione su di un enumerabile (un Array, una String, un Hash ma anche File, TCPSocket e molto altro)e’ semplice:
 enumerabile.each do |x|
  fai cose con x
 end

Ma ovviamente un Enumerable ci offre anche altri metodi molto comodi. Ad esempio, map() per effettuare una trasformazione su tutti gli elementi dell’oggetto, sort() per ordinarli, select() per selezionarne alcuni e così via.

Ma come possiamo fare noi per creare un oggetto con questi metodi?

Se conoscete Java starete pensando “oh, no, devo implementare l’interfaccia!”, ma in ruby, grazie ai Mixin potete evitarlo. Tutto quello di cui avete bisohgno e’ un metodo each().

Vediamo un esempio. Inizialmente creiamo una classe Tripla:
 >> class Tripla
 >>  def initialize(a,b,c)
 >>   @a,@b,@c=a,b,c
 >>  end
 >>  def each
 >>   yield @a
 >>   yield @b
 >>   yield @c
 >>  end
 >> end
 => nil
fin qui tutto semplice. Ora vediamo se funziona:
 >> t=Tripla.new 10, 20, 30
 => #<Tripla:0x27bd060 @b=20, @a=10, @c=30>
 >> t.each { |x| puts x }
 10
 20
 30
 => nil
perfetto! Ma ancora, questa classe non e’ completa. Per renderla simile ad Array o Hash dobbiamo enderla un Enumerable). Niente di complesso:
 >> class Tripla
 >>  include Enumerable
 >> end
 => Tripla
Ed ora:
 >> t=Tripla.new 17,42,11
 => #<Tripla:0x2753c30 @b=42, @a=17, @c=11>
 >> puts t.sort  # ordiniamoli
 11
 17
 42
 => nil
 >> puts t.map {|x| x*2} # raddoppiamo i valori
 34
 84
 22
 => nil
 >> puts t.select {|x| x%2==1} # selezioniamo i dispari
 17
 11
 => nil 

Facile no? ;)

Updated on March 31, 2006 21:40 by gabriele renzi (151.42.220.249)