Оценка блоков return и try-catch-finally в scala - PullRequest
14 голосов
/ 09 декабря 2011

Следующие два кода генерируют разные результаты:

def x = try{
  true
} finally false

invoke x получает true

def y:Boolean = try{
  return true
} finally {
  return false
}

invoke y получает false

the return Версия ведет себя так же, как Java.

Лично я никогда не использую 'return' в scala.Но хорошо знать, как scala оценивает значение блока try-catch-finally.Спасибо.

Ответы [ 2 ]

13 голосов
/ 09 декабря 2011

Вы не должны иметь оператор возврата в блоке finally (даже если это технически разрешено, по крайней мере в Java, например, в C # это запрещено).

Если бы в конце блока Scala был неявный возврат, это всегда приводило бы к сбою предполагаемого возвращаемого значения. Так что это не имеет смысла.

Но я полагаю, это не поможет вам, если вы напишите об этом прямо.

9 голосов
/ 09 декабря 2011

Согласно спецификации языка Scala:

Выражение try 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...