Ruby Memoization

转载 http://fuliang.iteye.com/blog/827321
module Memoizable
    def memoize( name, cache = Hash.new )
        original = "__unmemoized_#{name}__"
        ([Class, Module].include?(self.class) ? self : self.class).class_eval do
            alias_method original, name
            private
            original
            define_method(name) { |*args| cache.has_key?(args) ? cache[args] : cache[args] ||= send(original, *args) }
        end
    end
end

include Memoizable

def fib(n)
    return n if (0..1).include? n
    fib(n-1) + fib(n-2)
end

memoize :fib

根据不同参数来做一个hash缓存方法结果,这样不但可以缓存false,nil也能带参数了。
rails,已经有现成的activesupport/lib/active_support/memoizable.rb

你可能感兴趣的:(cache,Ruby)