Soluzione Aprile 2003 di Gabriele Renzi

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


la soluzione e’ simile nel concetto a quella di Luigi, ma la variabile in cui vengono mantenute le informazioni e’ una variabile d’istanza di un oggetto Memoize. Nel codice e’ presente un controllo sul blocco che viene passato, ma in realta`, non so perche’, con i blocchi non funziona. Quindi in realta`, i vari &blk possono essere tolti. In compenso funziona sia con parametri singoli, che con parametri assenti o variabili (*arg)
 class Memoize
  def initialize(sym)
    @met=method(sym)
    @val=Hash.new
  end
  def call(*args,&block)
   if not @val[[args,block]]
    @val[[args,block]]=@met.call(*args,&block)
   end
    @val[[args,block]]
  end
 end
che bello che ruby permetta di mettere qualunque cosa come chiave dell’hash :)

Dunque non volendo usare i blocchi è possibile scrivere:

 class Memoize
  def initialize(sym)
    @met=method(sym)
    @val=Hash.new
  end
  def call(*args)
   if not @val[args]
    @val[args]=@met.call(*args)
   end
    @val[args]
  end
 end
Infine la soluzione si ottiene con una piccola variante:
memoized_slowid=Memoize.new('slowid')

memoized_slowid.call(5)
5    (* in 5 secondi)

memoized_slowid.call(5)
5    (istantaneamente)
Updated on May 14, 2008 19:44 by Ruby Fan (213.156.38.71)