Class: Memoizer
Overview
Memoizer wraps objects to provide cached method calls.
class X
def initialize ; @tick = 0 ; end
def tick; @tick + 1; end
def memo; @memo ||= Memoizer.new(self) ; end
end
x = X.new
x.tick #=> 1
x.memo.tick #=> 2
x.tick #=> 3
x.memo.tick #=> 2
x.tick #=> 4
x.memo.tick #=> 2
You can also use to cache collections of objects to gain code speed ups.
points = points.collect{|point| Memoizer.cache(point)}
After our algorithm has finished using points, we want to get rid of these Memoizer objects. That’s easy:
points = points.collect{|point| point.__self__ }
Or if you prefer (it is ever so slightly safer):
points = points.collect{|point| Memoizer.uncache(point)}
Memoizer is the work of Erik Veenstra
Copyright © 2006 Erik Veenstra
See javathink.blogspot.com/2008/09/what-is-memoizer-and-why-should-you.html
Class Method Summary collapse
-
.cache(object) ⇒ Object
def self; @self; end.
- .uncache(cached_object) ⇒ Object
Instance Method Summary collapse
- #__self__ ⇒ Object
-
#initialize(object) ⇒ Memoizer
constructor
A new instance of Memoizer.
-
#method_missing(method_name, *args, &block) ⇒ Object
Not thread-safe! Speed is important in caches…
Constructor Details
#initialize(object) ⇒ Memoizer
Returns a new instance of Memoizer.
41 42 43 44 |
# File 'lib/standard/facets/memoizer.rb', line 41 def initialize(object) @self = object @cache = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, &block) ⇒ Object
Not thread-safe! Speed is important in caches… ;]
49 50 51 |
# File 'lib/standard/facets/memoizer.rb', line 49 def method_missing(method_name, *args, &block) @cache[[method_name, args, block]] ||= @self.__send__(method_name, *args, &block) end |
Class Method Details
.cache(object) ⇒ Object
def self; @self; end
55 56 57 |
# File 'lib/standard/facets/memoizer.rb', line 55 def self.cache(object) new(object) end |
.uncache(cached_object) ⇒ Object
59 60 61 |
# File 'lib/standard/facets/memoizer.rb', line 59 def self.uncache(cached_object) cached_object.instance_variable_get('@self') end |
Instance Method Details
#__self__ ⇒ Object
46 |
# File 'lib/standard/facets/memoizer.rb', line 46 def __self__ ; @self ; end |