&引用;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..
时,求值规则表示控制流离开当前执行的方法,返回给定的参数。