我经常使用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
  • 在很多情况下都会使代码困惑(与guard子句相对)。

  • 除了避免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/

    10-13 08:10