&引用;return";及;“最后尝试捕捉”;scala中的块计算

&引用;return";及;“最后尝试捕捉”;scala中的块计算,scala,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块的值是很好的。谢谢。您在finally块中有一个return语句(

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

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块的值是很好的。谢谢。

您在finally块中有一个return语句(尽管在技术上是允许的,至少在Java中是这样,例如C#禁止)

如果Scala finally块有一个隐式返回,那么它总是会超过预期的返回值。所以这毫无意义


但是我想如果你明确地这样写它,它对你没有帮助。

根据Scala语言规范:

try表达式try{b}e最后对块b求值。b的If评价 不会导致引发异常,表达式e将被计算。如果有例外 在计算e时抛出,则终止对try表达式的计算 使用抛出的异常。如果在计算e时没有抛出异常,则 b的结果作为try表达式的结果返回

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

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

调用
z
返回
false

但什么是“隐式返回”?“隐式返回”:可能是错误的词,但我的意思是Scala使用代码块中最后一行的结果作为块的返回值。Thilo是对的。将
return
语句放入
finally
块应视为错误,实际上是不允许的<代码>最后是清理内容,不管方法体是否成功或抛出异常。这不是决定返回值的地方!因此,
finally
子句的主体被用来计算
单元
。在第一个示例中,
false
隐式转换为
Unit
。因此得出的结论是:决不要在
finally
块中使用
return
,在Scala中,
finally
的主体对整个try-catch-finally表达式的求值没有影响。Sciss完成此答案。是的,从最后一个块返回会破坏流控制。它应该被禁止。
return
总是破坏流量控制。在这种情况下,它只会变得特别奇怪。这是根据规范。下面的一段说,
e
的类型应该符合
Unit
,这意味着
e
只评估其副作用。当
e
return..
时,求值规则表示控制流离开当前执行的方法,返回给定的参数。