Skip to content

Instantly share code, notes, and snippets.

@soulcutter
Created January 24, 2022 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soulcutter/fb79a919c86e684fa968b6935b2b5497 to your computer and use it in GitHub Desktop.
Save soulcutter/fb79a919c86e684fa968b6935b2b5497 to your computer and use it in GitHub Desktop.
Memoizing in Ruby without ivars and defined?
class Memoizer < Module
def initialize(method_name)
define_method(method_name) do
super().tap do |value|
puts "memoizing"
define_singleton_method(method_name) { value }
end
end
end
end
module Memoize
def memoize(method_name)
prepend Memoizer.new(method_name)
end
end
class ProofItWorks
@@num = 0
extend Memoize
def foo
puts "expensive"
@@num = @@num + 1
end
memoize(:foo)
end
class YourThing
extend Memoize
def v
$1 if xml =~ /blah/
end
memoize :v
end
@soulcutter
Copy link
Author

could (should?) have written ProofItWorks as a test, but I was mucking around in a REPL session

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment