"return" и "try-catch-finally" в scala
Следующие два кода генерируют разные результаты:
def x = try{
true
} finally false
invoke x получает true
def y:Boolean = try{
return true
} finally {
return false
}
invoke y получает false
версия return
работает так же, как Java.
Лично я никогда не использую 'return' в scala. Но хорошо знать, как scala оценить значение блока try-catch-finally. Спасибо.
Ответы
Ответ 1
Вы не должны иметь оператор return в блоке finally (хотя это технически разрешено, по крайней мере, на Java, например, С# запрещает его).
Если блок Scala finally имел неявный возврат, который всегда будет сжимать предполагаемое возвращаемое значение. Так что это не имеет смысла.
Но я полагаю, это не поможет вам, если вы явно напишете его таким образом.
Ответ 2
В соответствии со спецификацией языка 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
.