#!/usr/bin/env ruby # This code comes from http://ruby-it.org/pages/Soluzione+Aprile+2003+di+Gabriele+Renzi # Check the page for copyright notice and explanations 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 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 memoized_slowid=Memoize.new('slowid') memoized_slowid.call(5) 5 (* in 5 secondi) memoized_slowid.call(5) 5 (istantaneamente)