Comments 10
Если на scala адаптируется какой-то алгоритм с while + break, то есть всего 2 варианта:
- завернуть while в метод и делать return внутри
- избавиться от while в пользу хвостовой рекурсии
Второй вариант не всегда оправдан в случае «академического» алгоритма.
Нехилый косяк дизайна однако.
В шарпе return работает в рамках самой внутренней лямбды, как в скале умнейшие головы умудрились сделать такую бомбу — понять решительно невозможно.
Автор, пожалуй, слишком жестко подходит к использованию исключений (для breakable они в принципе нормально), но return через exception воистину за пределами добра и зла.
Нужен он чтоб подобное работало:
for (i <- 0 to (array.length - 1)) {
if (...) return array(i)
}
За пределами добра и зла это было когда в этом исключении был не отключен стектрейс. Теперь это не слишком дорого.
Не думайте, что на эти грабли наступают многие. Чтобы воспользоваться return в лямбде в scala для возвращения результата из этой лямбды надо обладать неординарным воображением.
Это компромисс для плавного перехода с java
Так в том и странность определения хода мысли автора фичи — получается return в скале работает одинаково не нативно что для скалы, что для явы.
Дальнейшее немного предсказуемо — раз уж последствия были замечены сразу и описаны в книге, то в ногу себе никто не стреляет.
А return для тех, кто документацию не прочитал.
Выше я описал единственную адекватную причину использовать return после прочтения инструкции.
В Java 8 вы можете без проблем использовать return внутри лямбд. Он работает именно внутри неё.
Не понимаю почему в Scala "не смогли", скорее "не захотели" так как для них только правило 1ин return и обязательно в конце.
Зачем в java return понятно — там есть множество синтаксических конструкций, не являющихся выражениями. В первую очередь это if и try.
В этом отношении в scala return не нужен.
И тем более он не нужен внутри лямбды: лямбда должна состоять из небольшого количества выражений, в идеале однострочник. Если же требуется что-то большое — пишите метод (и для java 8 работает).
Не используйте return в Scala