Funzionale Map

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


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 ary
basta fare:
puts oggEnumerable.map {|i| funzione(i)}
o se abbiamo a disposizione OggettiProcEMethod?:
 puts oggEnumerable.map &funzione
Ad 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.

Ruby, grazie al sistema degli iteratori, fa si che a qualunque oggetto definisca una funzione 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]]
Updated on November 26, 2005 13:09 by Ruby Fan (151.37.150.7)