我通常使用
然而,这里有一个陷阱。如果我通过一个守卫子句从
我可以通过避免使用
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
,还有更好的惯用语吗?
@
风格的实例变量。 - tadman