以下两个代码生成不同的结果:
def x = try{
true
} finally false
invoke x获取true
def y:Boolean = try{
return true
} finally {
return false
}
invoke y获取false
return
版本行为与Java相同。
就我个人而言,我从不在scala中使用'return‘。但是知道scala如何计算try-catch-finally块的值是很好的。谢谢。
发布于 2011-12-09 09:56:06
在finally块中有一条should not语句(即使这在技术上是允许的,至少在Java语言中是允许的,例如C#禁止这样做)。
如果Scala finally块有一个隐式的返回,那么它总是会破坏预期的返回值。所以这没有任何意义。
但我想,如果你明确地这样写它,它对你没有帮助。
发布于 2011-12-09 10:05:16
根据Scala语言规范:
A尝试表达式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
。
https://stackoverflow.com/questions/8443743
复制