Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
1e5fda76
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1e5fda76
编写于
4月 24, 2014
作者:
P
Patrick Toomey
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
backport memoiziation from 3.0
上级
7c3d4ec4
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
18 addition
and
11 deletion
+18
-11
activesupport/lib/active_support/memoizable.rb
activesupport/lib/active_support/memoizable.rb
+7
-4
activesupport/test/flush_cache_on_private_memoization_test.rb
...vesupport/test/flush_cache_on_private_memoization_test.rb
+1
-0
activesupport/test/memoizable_test.rb
activesupport/test/memoizable_test.rb
+10
-7
未找到文件。
activesupport/lib/active_support/memoizable.rb
浏览文件 @
1e5fda76
require
'active_support/core_ext/kernel/singleton_class'
require
'active_support/core_ext/module/aliasing'
module
ActiveSupport
module
Memoizable
def
self
.
memoized_ivar_for
(
symbol
)
...
...
@@ -41,10 +44,10 @@ def prime_cache(*syms)
end
end
def
flush_cache
(
*
syms
,
&
block
)
def
flush_cache
(
*
syms
)
syms
.
each
do
|
sym
|
(
methods
+
private_methods
+
protected_methods
).
each
do
|
m
|
if
m
.
to_s
=~
/^_unmemoized_(
#{
sym
}
)/
if
m
.
to_s
=~
/^_unmemoized_(
#{
sym
.
to_s
.
gsub
(
/\?\Z/
,
'\?'
)
}
)/
ivar
=
ActiveSupport
::
Memoizable
.
memoized_ivar_for
(
$1
)
instance_variable_get
(
ivar
).
clear
if
instance_variable_defined?
(
ivar
)
end
...
...
@@ -69,7 +72,7 @@ def memoize(*symbols)
if instance_method(:
#{
symbol
}
).arity == 0 # if instance_method(:mime_type).arity == 0
def
#{
symbol
}
(reload = false) # def mime_type(reload = false)
if reload || !defined?(
#{
memoized_ivar
}
) ||
#{
memoized_ivar
}
.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
#{
memoized_ivar
}
= [
#{
original_method
}
.freeze] # @_memoized_mime_type = [_unmemoized_mime_type.freez
e]
#{
memoized_ivar
}
= [
#{
original_method
}
] # @_memoized_mime_type = [_unmemoized_mime_typ
e]
end # end
#{
memoized_ivar
}
[0] # @_memoized_mime_type[0]
end # end
...
...
@@ -82,7 +85,7 @@ def #{symbol}(*args) # def m
if !reload &&
#{
memoized_ivar
}
.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
#{
memoized_ivar
}
[args] # @_memoized_mime_type[args]
elsif
#{
memoized_ivar
}
# elsif @_memoized_mime_type
#{
memoized_ivar
}
[args] =
#{
original_method
}
(*args)
.freeze # @_memoized_mime_type[args] = _unmemoized_mime_type(*args).freeze
#{
memoized_ivar
}
[args] =
#{
original_method
}
(*args)
# @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
end # end
else # else
#{
original_method
}
(*args) # _unmemoized_mime_type(*args)
...
...
activesupport/test/flush_cache_on_private_memoization_test.rb
浏览文件 @
1e5fda76
require
'abstract_unit'
require
'active_support'
require
'test/unit'
...
...
activesupport/test/memoizable_test.rb
浏览文件 @
1e5fda76
...
...
@@ -4,12 +4,13 @@ class MemoizableTest < Test::Unit::TestCase
class
Person
extend
ActiveSupport
::
Memoizable
attr_reader
:name_calls
,
:age_calls
,
:is_developer_calls
attr_reader
:name_calls
,
:age_calls
,
:is_developer_calls
,
:name_query_calls
def
initialize
@name_calls
=
0
@age_calls
=
0
@is_developer_calls
=
0
@name_query_calls
=
0
end
def
name
...
...
@@ -18,6 +19,7 @@ def name
end
def
name?
@name_query_calls
+=
1
true
end
memoize
:name?
...
...
@@ -123,6 +125,13 @@ def test_memoization_with_punctuation
end
end
def
test_memoization_flush_with_punctuation
assert_equal
true
,
@person
.
name?
@person
.
flush_cache
(
:name?
)
3
.
times
{
assert_equal
true
,
@person
.
name?
}
assert_equal
2
,
@person
.
name_query_calls
end
def
test_memoization_with_nil_value
assert_equal
nil
,
@person
.
age
assert_equal
1
,
@person
.
age_calls
...
...
@@ -131,13 +140,7 @@ def test_memoization_with_nil_value
assert_equal
1
,
@person
.
age_calls
end
def
test_memorized_results_are_immutable
assert_equal
"Josh"
,
@person
.
name
assert_raise
(
ActiveSupport
::
FrozenObjectError
)
{
@person
.
name
.
gsub!
(
"Josh"
,
"Gosh"
)
}
end
def
test_reloadable
counter
=
@calculator
.
counter
assert_equal
1
,
@calculator
.
counter
assert_equal
2
,
@calculator
.
counter
(
:reload
)
assert_equal
2
,
@calculator
.
counter
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录