メソッドのキャッシュ化(ボトルネック解消!)

ボトルネックメソッドを見つけたらどうしよう。
という事で、キャッシュ化してみる事にした。

以下がそのModule

module Cache
  def memoize(fn)
    cache = {};
    Proc.new do |*args|
      unless cache[*args]
        cache[*args] = fn.call(*args)
      end
      cache[*args]
    end
  end
end

使いたいクラスにincludeしてやって
キャッシュ用のメソッドをつくっちゃう。

class Target
  include Cache

  def initialize
    #キャッシュ用のProc作成
    @cache_nyan_proc = memoize(self.method :say )
  end

 #キャッシュしたいボトルネックメソッド
  def say(wan)
    puts wan
    wan
  end

  #実際にキャッシュするメソッド
  def cache_say(wan)
    @cache_nyan_proc.call(wan)
  end
end

このメソッドを読んでやると結果はこうなります。

irb(main):348:0> target = Target.new
=> #<Target:0x2d04bc8 @cache_nyan_proc=#<Proc:0x029e0450@cache.rb:322>>
irb(main):349:0> target.cache_say("aaa")
aaa    #←ここで puts aaaが呼ばれている。
=> "aaa"
irb(main):350:0> target.cache_say("aaa")
=> "aaa" #←二回目以降はメソッドは呼ばれない
irb(main):351:0> target.cache_say("aab")
aab      #←違う値にするとメソッドが実行される
=> "aaa"

2〜3時間で書いたので、不具合ありまくりだと思いますー。