Игнорируя вложенные функции, всегда можно заменить вычисления Scala на результаты эквивалентными вычислениями без возвратов. Этот результат восходит к ранним временам «структурированного программирования» и называется «1001» структурированной программной теоремой , достаточно умно.
С вложенными функциями ситуация меняется. Scala позволяет размещать «возврат» глубоко внутри ряда вложенных функций. Когда возвращение выполнено, управление выпрыгивает из всех вложенных функций в самый внутренний содержащий метод, из которого он возвращается (при условии, что метод фактически все еще выполняется, в противном случае выдается исключение). Этот вид раскрутки стека может быть сделан с исключениями, но не может быть сделан с помощью механической реструктуризации вычисления (как это возможно без вложенных функций).
Наиболее распространенная причина, по которой вы на самом деле хотели бы вернуться из вложенной функции, - это выйти из императивного блока для понимания или управления ресурсами. (Тело императивного понимания понимается как вложенная функция, даже если оно выглядит как утверждение.)
for(i<- 1 to bezillion; j <- i to bezillion+6){
if(expensiveCalculation(i, j)){
return otherExpensiveCalculation(i, j)
}
withExpensiveResource(urlForExpensiveResource){ resource =>
// do a bunch of stuff
if(done) return
//do a bunch of other stuff
if(reallyDoneThisTime) return
//final batch of stuff
}