Skip to content

Instantly share code, notes, and snippets.

@itchy
Created January 29, 2013 15:31
Show Gist options
  • Save itchy/4665116 to your computer and use it in GitHub Desktop.
Save itchy/4665116 to your computer and use it in GitHub Desktop.
memoized 9 examples
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def initialize
@distances = {}
end
def distance(*segments)
# @distances[segments] ||= calculate_distance(*segments) # => only works if value != nil
if @distances.has_key?(segments)
@distances[segments]
else
@distances[segments] = calculate_distance(*segments)
end
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
class MemoizedRoutes < Routes
def initialize
@distances = {}
end
def distance(*segments)
if @distances.has_key?(segments)
@distances[segments]
else
@distances[segments] = super
end
end
end
r = MemoizedRoutes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
def memoized(cls, method)
Class.new(cls) do
memory = {}
define_method method do |*args|
if memory.has_key?(args)
memory[args]
else
memory[args] = super
end
end
end
end
r = memoized(Routes, :distance).new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
def r.distance(*segments)
@memory ||= {}
if @memory.has_key?(segments)
@memory[segments]
else
@memory[segments] = super
end
end
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
def memoize(obj, method)
eigen = class << obj; self; end # => here and the next line
eigen.class_eval do
memory ||= {}
define_method method do |*args|
if memory.has_key?(args)
memory[args]
else
memory[args] = super
end
end
end
end
r = Routes.new
memoize(r, :distance)
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
class Routes
def distance(*segments)
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
class Routes
alias_method :_original_distance_, :distance
def distance(*segments)
@memory ||= {}
if @memory.has_key?(segments)
@memory[segments]
else
@memory[segments] = _original_distance_(*segments)
end
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
module Memoize
def remember(name)
original = "original #{name}"
alias_method original, name
memory ||= {}
define_method name do |*args|
if memory.has_key?(args)
memory[args]
else
memory[args] = send original, *args
end
end
end
end
class Routes
extend Memoize
def distance(*segments)
calculate_distance(*segments)
end
remember :distance
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
module Memoize
def remember(name)
original_method = instance_method(name)
memory ||= {}
define_method name do |*args|
if memory.has_key?(args)
memory[args]
else
bound_method = original_method.bind(self)
memory[args] = bound_method.call(*args)
end
end
end
end
class Routes
extend Memoize
def distance(*segments)
calculate_distance(*segments)
end
remember :distance
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
module Memoize
def remember(name, &block)
define_method(name, &block)
original_method = instance_method(name)
memory ||= {}
define_method name do |*args|
if memory.has_key?(args)
memory[args]
else
bound_method = original_method.bind(self)
memory[args] = bound_method.call(*args)
end
end
end
end
class Routes
extend Memoize
remember :distance do |*segments|
calculate_distance(*segments)
end
private
def calculate_distance(*segments)
puts "Expensive Task"
segments.inject { |sum, val| sum + val }
end
end
r = Routes.new
puts r.distance 1,2,3,4
puts r.distance 1,2,3,4
puts r.distance 9,8,7,6
puts r.distance 9,8,7,6
#!/usr/bin/env ruby
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment