Note:
Testo rimosso dalla rev 4 e
Testo aggiunto nella rev5
Effettuare un’iterazione su di un enumerabile (un o, una o, un )e’ ma anche
ArrayStringHashFile, 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().
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 => nilfin 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 => nilperfetto! 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 => TriplaEd 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? ;)