"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.