Семантика относительно проста: return
сгенерирует NonLocalReturnControl
, который пойман при включающем методе toUpper
. Это не похоже на недавнюю особенность; в журнале изменений Scala нет упоминания return
, начиная с версии 2.0.
Вот соответствующее описание из спецификации языка Scala, раздел 6.20:
Возврат из вложенной анонимной функции осуществляется путем броска
и перехватывает исключение scala.runtime.NonLocalReturnException. Любое исключение
ловит между точкой возврата и включающими методами может
увидеть исключение. Ключевое сравнение гарантирует, что эти исключения
перехватывается только экземпляром метода, который завершается возвратом.
Если возвращаемое выражение само является частью анонимной функции, оно
возможно, что включающий экземпляр f уже вернулся
перед выполнением выражения возврата. В этом случае, брошенный
scala.runtime.NonLocalReturnException не будет пойман, и будет
распространять вверх по стеку вызовов.
Вот пример, в котором NonLocalReturnControl
убегает:
var g: () => Unit = _
def f() { g = () => return }
f() // set g
g() // scala.runtime.NonLocalReturnControl$mcI$sp