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 endche 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 endInfine 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)