scala中的“return”和“try-catch-finally”块评估

时间:2011-12-09 09:52:17

标签: scala

以下两个代码会产生不同的结果:

def x = try{
  true
} finally false

调用x获取true

def y:Boolean = try{
  return true
} finally {
  return false
}

调用y获取false

return版本的行为与Java相同。

我个人从不在scala中使用'return'。但是知道scala如何评估try-catch-finally块的值是很好的。感谢。

2 个答案:

答案 0 :(得分:13)

should not在finally块中有一个return语句(即使在技术上允许,至少在Java中,C#例如禁止它)。

如果Scala finally块有隐式返回,那么总是会破坏预期的返回值。所以这没有意义。

但是,如果你明确地这样写的话,我想它无法帮助你。

答案 1 :(得分:9)

根据Scala语言规范:

  

尝试表达式try {b}最后e计算块b。如果评价b   不会引发异常,评估表达式e。如果是例外   在评估e期间抛出,对try表达式的评估被中止   抛出异常。如果在评估e期间没有抛出异常,那么   b的结果作为try表达式的结果返回。

这种行为似乎与该规范相矛盾。我猜想,因为'return'会立即从函数返回,这会导致覆盖try块的标准行为。一个有启发性的例子是:

def z : Boolean = {
  val foo = try { true } finally { return false }
  true
}

调用z会返回false