Как стать автором
Обновить

Комментарии 10

Это все-таки об идиоматичном коде.
Если на scala адаптируется какой-то алгоритм с while + break, то есть всего 2 варианта:
  1. завернуть while в метод и делать return внутри
  2. избавиться от while в пользу хвостовой рекурсии

Второй вариант не всегда оправдан в случае «академического» алгоритма.

Нехилый косяк дизайна однако.
В шарпе return работает в рамках самой внутренней лямбды, как в скале умнейшие головы умудрились сделать такую бомбу — понять решительно невозможно.
Автор, пожалуй, слишком жестко подходит к использованию исключений (для breakable они в принципе нормально), но return через exception воистину за пределами добра и зла.

Это компромисс для плавного перехода с java. Если не ошибаюсь негативные его последствия были описаны еще в первой версии Programming in Scala.
Нужен он чтоб подобное работало:
for (i <- 0 to (array.length - 1)) {
  if (...) return array(i)
}

За пределами добра и зла это было когда в этом исключении был не отключен стектрейс. Теперь это не слишком дорого.

Не думайте, что на эти грабли наступают многие. Чтобы воспользоваться return в лямбде в scala для возвращения результата из этой лямбды надо обладать неординарным воображением.
Это компромисс для плавного перехода с java

Так в том и странность определения хода мысли автора фичи — получается return в скале работает одинаково не нативно что для скалы, что для явы.
Дальнейшее немного предсказуемо — раз уж последствия были замечены сразу и описаны в книге, то в ногу себе никто не стреляет.

НЛО прилетело и опубликовало эту надпись здесь
Либо удосужится прочитать документацию и узнать о find/collectFirst и ленивых коллекциях.
Чтоб не быть голословным: https://scalafiddle.io/sf/1PJR8IG/0

А return для тех, кто документацию не прочитал.
Выше я описал единственную адекватную причину использовать return после прочтения инструкции.

В Java 8 вы можете без проблем использовать return внутри лямбд. Он работает именно внутри неё.
Не понимаю почему в Scala "не смогли", скорее "не захотели" так как для них только правило 1ин return и обязательно в конце.

Вы мне отвечаете?

Зачем в java return понятно — там есть множество синтаксических конструкций, не являющихся выражениями. В первую очередь это if и try.

В этом отношении в scala return не нужен.

И тем более он не нужен внутри лямбды: лямбда должна состоять из небольшого количества выражений, в идеале однострочник. Если же требуется что-то большое — пишите метод (и для java 8 работает).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории