A cosa serve
map()
Essa permette di applicare una funzione su ogni elemento di una collezione, restituendo un Array con i risultati. In pratica, invece di
ary=Array.new for i in oggEnumerable ary.push(funzione(i)) end puts arybasta fare:
puts oggEnumerable.map {|i| funzione(i)}o se abbiamo a disposizione OggettiProcEMethod?:
puts oggEnumerable.map &funzioneAd esempio, supponiamo di voler creare un nuovo file contenente tutte le linee di
'esempio.txt' ma scritte al contrario. la funzione che ci serve per scriverle al contrario e’ reverse(), il modo più semplice per farlo sarebbe:
print File.new('esempio.txt').map {|linea| linea.reverse}Possiamo poi usare
map() per estrarre delle informazioni sugli oggetti, ad esempio, potremmo decidere di sapere qual’è la lunghezza delle linee del file:
puts File.new('esempio.txt').map {|linea| linea.length}
In generale, map() e’ la soluzione migliore per molti problemi in linguaggi funzionali tipo il LISP. Ma la potenza e la chiarezza di questa funzione hanno fatto si che venisse importata anche in altri sistemi, come ad esempio SmallTalk, python e ruby.
each() possa rendere disponibile anche map() facilmente.
Ad esempio:
>> class Tripla >> def initialize(a,b,c) >> @a,@b,@c=a,b,c >> end >> def each >> yield @a >> yield @b >> yield @c >> end >> include Enumerable # ecco la magia! >> end => Tripla >> t=Tripla.new( 13,'miao',[1,2,3] ) => #<Tripla:0x27f8b10 @b="miao", @a=13, @c=[1, 2, 3]> >> t.map {|x| x * 2 } => [26, "miaomiao", [1, 2, 3, 1, 2, 3]]