Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
3fc9a67c
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,发现更多精彩内容 >>
提交
3fc9a67c
编写于
8月 13, 2008
作者:
J
Jeremy Kemper
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
memoize_ and unmemoize_all
上级
3284fbb8
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
48 addition
and
18 deletion
+48
-18
activesupport/lib/active_support/memoizable.rb
activesupport/lib/active_support/memoizable.rb
+33
-18
activesupport/test/memoizable_test.rb
activesupport/test/memoizable_test.rb
+15
-0
未找到文件。
activesupport/lib/active_support/memoizable.rb
浏览文件 @
3fc9a67c
...
@@ -10,25 +10,37 @@ def self.included(base)
...
@@ -10,25 +10,37 @@ def self.included(base)
end
end
def
freeze_with_memoizable
def
freeze_with_memoizable
unless
frozen?
memoize_all
unless
frozen?
methods
.
each
do
|
method
|
freeze_without_memoizable
if
method
.
to_s
=~
/^_unmemoized_(.*)/
end
begin
__send__
(
$1
).
freeze
def
memoize_all
rescue
ArgumentError
methods
.
each
do
|
m
|
if
m
.
to_s
=~
/^_unmemoized_(.*)/
if
method
(
m
).
arity
==
0
__send__
(
$1
)
else
ivar
=
:"@_memoized_
#{
$1
}
"
instance_variable_set
(
ivar
,
{})
end
end
end
end
end
end
end
end
freeze_without_memoizable
def
unmemoize_all
methods
.
each
do
|
m
|
if
m
.
to_s
=~
/^_unmemoized_(.*)/
ivar
=
:"@_memoized_
#{
$1
}
"
instance_variable_get
(
ivar
).
clear
if
instance_variable_defined?
(
ivar
)
end
end
end
end
end
end
def
memoize
(
*
symbols
)
def
memoize
(
*
symbols
)
symbols
.
each
do
|
symbol
|
symbols
.
each
do
|
symbol
|
original_method
=
"_unmemoized_
#{
symbol
}
"
original_method
=
:
"_unmemoized_
#{
symbol
}
"
memoized_ivar
=
"@_memoized_
#{
symbol
.
to_s
.
sub
(
/\?\Z/
,
'_query'
).
sub
(
/!\Z/
,
'_bang'
)
}
"
memoized_ivar
=
:
"@_memoized_
#{
symbol
.
to_s
.
sub
(
/\?\Z/
,
'_query'
).
sub
(
/!\Z/
,
'_bang'
)
}
"
class_eval
<<-
EOS
,
__FILE__
,
__LINE__
class_eval
<<-
EOS
,
__FILE__
,
__LINE__
include Freezable
include Freezable
...
@@ -38,22 +50,25 @@ def memoize(*symbols)
...
@@ -38,22 +50,25 @@ def memoize(*symbols)
if instance_method(:
#{
symbol
}
).arity == 0
if instance_method(:
#{
symbol
}
).arity == 0
def
#{
symbol
}
(reload = false)
def
#{
symbol
}
(reload = false)
if !reload && defined?
#{
memoized_ivar
}
if reload || !defined?(
#{
memoized_ivar
}
) ||
#{
memoized_ivar
}
.empty?
#{
memoized_ivar
}
#{
memoized_ivar
}
= [
#{
original_method
}
]
else
#{
memoized_ivar
}
=
#{
original_method
}
end
end
#{
memoized_ivar
}
[0]
end
end
else
else
def
#{
symbol
}
(*args)
def
#{
symbol
}
(*args)
#{
memoized_ivar
}
||= {}
#{
memoized_ivar
}
||= {}
unless frozen?
reload = args.pop if args.last == true || args.last == :reload
reload = args.pop if args.last == true || args.last == :reload
if !reload &&
#{
memoized_ivar
}
&&
#{
memoized_ivar
}
.has_key?(args)
if
#{
memoized_ivar
}
if !reload &&
#{
memoized_ivar
}
.has_key?(args)
#{
memoized_ivar
}
[args]
#{
memoized_ivar
}
[args]
else
elsif
#{
memoized_ivar
}
#{
memoized_ivar
}
[args] =
#{
original_method
}
(*args)
#{
memoized_ivar
}
[args] =
#{
original_method
}
(*args)
end
end
else
#{
original_method
}
(*args)
end
end
end
end
end
EOS
EOS
...
...
activesupport/test/memoizable_test.rb
浏览文件 @
3fc9a67c
...
@@ -119,6 +119,21 @@ def test_reloadable
...
@@ -119,6 +119,21 @@ def test_reloadable
assert_equal
3
,
@calculator
.
counter
assert_equal
3
,
@calculator
.
counter
end
end
def
test_unmemoize_all
assert_equal
1
,
@calculator
.
counter
assert
@calculator
.
instance_variable_get
(
:@_memoized_counter
).
any?
@calculator
.
unmemoize_all
assert
@calculator
.
instance_variable_get
(
:@_memoized_counter
).
empty?
assert_equal
2
,
@calculator
.
counter
end
def
test_memoize_all
@calculator
.
memoize_all
assert
@calculator
.
instance_variable_defined?
(
:@_memoized_counter
)
end
def
test_memoization_cache_is_different_for_each_instance
def
test_memoization_cache_is_different_for_each_instance
assert_equal
1
,
@calculator
.
counter
assert_equal
1
,
@calculator
.
counter
assert_equal
2
,
@calculator
.
counter
(
:reload
)
assert_equal
2
,
@calculator
.
counter
(
:reload
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录