Memoized
Memoized will memoize the results of your methods. It acts much like
ActiveSupport::Memoizable
without all of that freezing business. The API for
unmemoizing is also a bit more explicit.
Install
$ gem install memoized
Usage
To define a memoized instance method, use memoize def
:
class A
include Memoized
memoize def hello
'hello!'
end
end
You may also memoize
one or more methods after they have been defined:
class B
include Memoized
def hello
'hello!'
end
def goodbye
'goodbye :('
end
memoize :hello, :goodbye
end
Memoizing class methods works the same way:
class C
class << self
include Memoized
memoize def hello
'hello!'
end
end
end
To unmemoize a specific method:
instance = A.new
instance.hello # the hello method is now memoized
instance.unmemoize(:hello) # the hello method is no longer memoized
instance.hello # the hello method is run again and re-memoized
To unmemoize all methods for an instance:
instance = B.new
instance.hello # the hello method is now memoized
instance.goodbye # the goodbye method is now memoized
instance.unmemoize_all # neither hello nor goodbye are memoized anymore
Limitations
When you are using Memoized with default arguments or default keyword arguments, there are some edge cased you have to keep in mind.
When you memoize a method with (keyword) arguments that have an expression as default value, you should be aware that the expression is evaluated only once.
memoize def print_time(time = Time.now)
time
end
print_time
=> 2021-07-23 14:23:18 +0200
sleep(1.minute)
print_time
=> 2021-07-23 14:23:18 +0200
When you memoize a method with (keyword) arguments that have default values, you should be aware that Memoized differentiates between a method call without arguments and the default values.
def true_or_false(default = true)
puts 'calculate value ...'
default
end
true_or_false
calculate value ...
=> true
true_or_false
=> true
true_or_false(true)
calculate value ...
=> true
Development
There are tests in spec
. We only accept PRs with tests. To run tests:
- Install Ruby 2.6.1
- Install development dependencies using
bundle install
- Run tests using
bundle exec rake current_rspec
We recommend to test large changes against multiple versions of Ruby. Supported combinations are configured in .github/workflows/test.yml
. We provide some rake tasks to help with this:
- Install development dependencies using
bundle exec rake matrix:install
- Run tests using
bundle exec rake matrix:spec
Note that we have configured GitHub Actions to automatically run tests in all supported Ruby versions and dependency sets after each push. We will only merge pull requests after a green GitHub Actions run.
I'm very eager to keep this gem leightweight and on topic. If you're unsure whether a change would make it into the gem, talk to me beforehand.
License
See LICENSE.txt