【发布时间】:2017-08-13 11:12:13
【问题描述】:
我经常使用 begin ... end 块语法来记忆 Ruby 方法:
$memo = {}
def calculate(something)
$memo[something] ||= begin
perform_calculation(something)
end
end
但是,这里有一个问题。如果我通过保护子句从begin ... end 块中提前返回,则结果不会被记忆:
$memo = {}
def calculate(something)
$memo[something] ||= begin
return 'foo' if something == 'bar'
perform_calculation(something)
end
end
# does not memoize 'bar'; method will be run each time
我可以通过避免 return 语句来避免这种情况:
$memo = {}
def calculate(something)
$memo[something] ||= begin
if something == 'bar'
'foo'
else
perform_calculation(something)
end
end
end
这可行,但我不喜欢它,因为:
- 很容易忘记在这种情况下我不允许使用
return。 - 在许多情况下,与保护子句相反,它会使代码混乱。
除了避免return之外,还有更好的成语吗?
【问题讨论】:
-
一篇关于一些约定的好文章:justinweiss.com/articles/…
-
我强烈建议不要使用全局变量进行缓存。保持变量上下文相关很重要,即尽可能使用
@样式的实例变量。 -
如果你的程序有纯函数,你可以更进一步,缓存方法调用自己。例如cache-method。为缓存提供离散 API 的一个好处是,如果需要,可以更轻松地切换持久性类型。
标签: ruby memoization