提交 911c2c38 编写于 作者: T Tarmo Tänav 提交者: Joshua Peek

Some performance tweaks to ActiveSupport::Memoizable

Signed-off-by: NJoshua Peek <josh@joshpeek.com>
上级 001c8beb
......@@ -7,10 +7,12 @@ def self.included(base) #:nodoc:
module ClassMethods
def memoize(symbol)
original_method = "_unmemoized_#{symbol}"
raise "Already memoized #{symbol}" if instance_methods.map(&:to_s).include?(original_method)
alias_method original_method, symbol
class_eval <<-EOS, __FILE__, __LINE__
def #{symbol}
if instance_variable_defined?(:@#{symbol})
if defined? @#{symbol}
@#{symbol}
else
@#{symbol} = #{original_method}
......@@ -22,7 +24,7 @@ def #{symbol}
def freeze
methods.each do |method|
if m = method.to_s.match(/^_unmemoized_(.*)/)
if m = method.to_s.match(/\A_unmemoized_(.*)/)
send(m[1]).freeze
end
end
......
......@@ -41,5 +41,9 @@ def test_memoization_frozen_with_nil_value
person.freeze
assert_equal nil, person.age
end
def test_double_memoization
assert_raise(RuntimeError) { Person.memoize :name }
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册