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