Module: Locale::Util

Child modules and classes

Module Locale::Util::Memoizable

Aliases

Old nameNew name
freeze freeze_without_memoizable

Public Class Methods


included (base)

    # File lib/locale/util/memoizable.rb, line 13
13:       def self.included(base)
14:         mod = self
15:         base.class_eval do
16:           extend mod
17:         end
18:       end

Public Instance Methods


clear ()

Clear memoized values.

    # File lib/locale/util/memoizable.rb, line 29
29:       def clear
30:         @_memoized_ivars = {}
31:       end

memoize (*symbols)

Cache the result of the methods.

 include Memoizable
 def foo
   ......
 end
 def bar(a, b)
   ......
 end
 memoize :foo, :bar(a, b)

To clear cache, clear_foo, clear_bar is also defined.

(NOTE) Consider to use this with huge objects to avoid memory leaks.

    # File lib/locale/util/memoizable.rb, line 47
47:       def memoize(*symbols)
48:         symbols.each do |symbol|
49:           original_method = "_unmemoized_#{symbol}"
50:           memoized_ivar = MEMOIZED_IVAR.call(symbol)
51:           class_eval "raise \"Already memoized \#{symbol}\" if method_defined?(:\#{original_method})\nalias \#{original_method} \#{symbol}\n\ndef \#{symbol}(*args)\n@_memoized_ivars ||= {}\n@_memoized_ivars[:\#{memoized_ivar}] ||= {}\n\nkey = args.hash\n\nret = @_memoized_ivars[:\#{memoized_ivar}][key]\n\nif ret\nret\nelse\n@_memoized_ivars[:\#{memoized_ivar}][key] = \#{original_method}(*args).freeze\nend\nend\n\n", __FILE__, __LINE__
52:         end
53:       
54:       end