Guest User

Untitled

a guest
Feb 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.45 KB | None | 0 0
  1. def self.cache(name, &p)
  2. raise "no block given" unless block_given?
  3. n, v = *((p.arity<0)? [-p.arity-1,true] : [p.arity,false])
  4. args = (('a'..'z').to_a[0,n]+(v ? ['*args']:[])).join(',')
  5. eval "define_method(:_#{name}) {|#{args}| p.call(#{args})}"
  6. eval "define_method(:#{name}) {|#{args}| (@cache ||= {})[[name,#{args}]] ||= _#{name}(#{args})}"
  7. eval "define_method(:#{name}!) {|#{args}| (@cache ||= {})[[name,#{args}]] = _#{name}(#{args})}"
  8. end
Add Comment
Please, Sign In to add comment