Skip to content

Instantly share code, notes, and snippets.

@santosh79
santosh79 / discounter.rb
Created November 17, 2009 06:05
basic discounter
class Discounter
def discount(*skus)
expensive_calc(skus)
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
skus.inject{|m,n| m + n}
end
@santosh79
santosh79 / discounter_with_basic_memoization.rb
Created November 17, 2009 06:08
memoization with instance variable
class Discounter
def discount(*skus)
@memory ||= {}
@memory[skus] = expensive_calc(skus) unless @memory.has_key?(skus)
@memory[skus]
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
@santosh79
santosh79 / moving_memoization_to_subclass.rb
Created November 17, 2009 06:12
memoization with sub-class
class Discounter
def discount(*skus)
expensive_calc(skus)
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
skus.inject{|m,n| m + n}
end
@santosh79
santosh79 / memoizing_a_class.rb
Created November 17, 2009 06:22
memoizing w/sub-class - returning a new class
class Discounter
def discount(*skus)
expensive_calc(skus)
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
skus.inject{|m,n| m + n}
end
@santosh79
santosh79 / memoizing_singletons.rb
Created November 17, 2009 06:32
memoizing on object level
class Discounter
def discount(*skus)
expensive_calc(skus)
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
skus.inject{|m,n| m + n}
end
@santosh79
santosh79 / memoization_with_method_rewrite.rb
Created November 17, 2009 17:10
Memoization method re-write
class Discounter
def discount(*skus)
expensive_calc(skus)
end
private
def expensive_calc(*skus)
puts "in expensive calc for #{skus}"
skus.inject{|m,n| m + n}
end
@santosh79
santosh79 / memoizing_mixing_in_module.rb
Created November 17, 2009 17:35
Memoization by module mixin
module Memoize
def remember(method)
orig_method_name = "_original_#{method.to_s}_"
alias_method orig_method_name.to_sym, method
define_method(method) do |*args|
@memory ||= {}
@memory[args] = send(orig_method_name,args) unless @memory.has_key?(args)
@memory[args]
@santosh79
santosh79 / memoization_with_method_binding.rb
Created November 17, 2009 17:37
Memoization with method binding
module Memoize
def remember(method)
original_method = instance_method(method)
define_method(method) do |*args|
@memory ||= {}
bound_method = original_method.bind(self)
@memory[args] = bound_method.call(args) unless @memory.has_key?(args)
@memory[args]
@santosh79
santosh79 / memoizer_in_dsl_form.rb
Created November 17, 2009 18:06
DSL form of memoizer
module Memoize
def remember(method, &block)
define_method(method, block)
original_method = instance_method(method)
define_method(method) do |*args|
@memory ||= {}
bound_method = original_method.bind(self)
@memory[args] = bound_method.call(args) unless @memory.has_key?(args)
@santosh79
santosh79 / using_the_inherited_callback.rb
Created November 17, 2009 20:12
inherited callback
class ShippingOption
def self.children
@children ||= []
end
def self.inherited(child_class)
children << child_class
end
def self.for(weight, international)