我经常使用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
之外,还有更好的习惯用法吗? 最佳答案
据我所知,begin ... end不能短路。您可以使用proc完全完成您要尝试执行的操作:
$memo = {}
def calculate(something)
$memo[something] ||= -> do
return 'foo' if something == 'bar'
perform_calculation(something)
end.call
end
话虽这么说,我从未见过这样做,所以这当然不是惯用的。
关于ruby - 短路Ruby `begin ... end`块的正确习惯是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42933005/