Skip to content

Instantly share code, notes, and snippets.

@dinks
Created April 22, 2015 13:17
Show Gist options
  • Save dinks/fa73118ede19a5dec4ee to your computer and use it in GitHub Desktop.
Save dinks/fa73118ede19a5dec4ee to your computer and use it in GitHub Desktop.
Memoize in Ruby
# Memoize with extend
module Memoize
def memoize(method)
unmemoized_name = :"__unmemoized_#{method}"
alias_method unmemoized_name, method
define_method method do
@__memoized_results ||= {}
if @__memoized_results.include? method
p "Call from memoize"
@__memoized_results[method]
else
p "First time call"
@__memoized_results[method] = send(unmemoized_name)
end
end
end
end
class A
extend Memoize
def t1
10
end
memoize :t1
end
a = A.new
p a.t1 # First time call
p a.t1 # Call from memoize
p a.t1 # Call from memoize
p a.t1 # Call from memoize
# Memoize with prepend
module Memoize
def memoize(method)
memoizer = Module.new do
define_method method do
@__memoized_results ||= {}
if @__memoized_results.include? method
p "Call from memoize"
@__memoized_results[method]
else
p "First time call"
@__memoized_results[method] = super()
end
end
end
prepend memoizer
end
end
class B
extend Memoize
def t1
10
end
memoize :t1
end
p B.ancestors
b = B.new
p b.t1 # First time call
p b.t1 # Call from memoize
p b.t1 # Call from memoize
p b.t1 # Call from memoize
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment