-
Alternatively, if you only need to memoize ONE function you can do:
class Memoizer def factorial(n) with_cache(n) do |n| puts "calling factorial(#{n})" n == 0 ? 1 : n * factorial(n - 1) end end def with_cache(*args, &blk) (@_cache ||= Hash.new { |memo, keys| memo[keys] = blk.call(*keys) })[args] end end # m = Memoizer.new # irb(main):012> m=Memoizer.new # => #<Memoizer:0x00007ff826151b40> # irb(main):013> p m.factorial(3) # calling factorial(3) # calling factorial(2) # calling factorial(1) # calling factorial(0) # 6 # => 6 # irb(main):014> p m.factorial(4) # calling factorial(4) # 24 # => 24
Please register or sign in to comment